<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  
  <title>Work diary on 2015 | Matrix207&#39;s Blog</title>
  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
  <meta name="description" content="2015-11-15
study plugin architecture
Making a Plugin System
如何设计插件式结构的程序，兼谈Python语言的动态性
http://www.cnblogs.com/sld666666/p/3519467.html
http://tianya23.blog.51cto.com/1081650/569798
http://www.devbean">
<meta property="og:type" content="website">
<meta property="og:title" content="Work diary on 2015">
<meta property="og:url" content="http://yoursite.com/work_diary/2015.html">
<meta property="og:site_name" content="Matrix207's Blog">
<meta property="og:description" content="2015-11-15
study plugin architecture
Making a Plugin System
如何设计插件式结构的程序，兼谈Python语言的动态性
http://www.cnblogs.com/sld666666/p/3519467.html
http://tianya23.blog.51cto.com/1081650/569798
http://www.devbean">
<meta property="og:updated_time" content="2016-07-16T16:04:43.000Z">
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="Work diary on 2015">
<meta name="twitter:description" content="2015-11-15
study plugin architecture
Making a Plugin System
如何设计插件式结构的程序，兼谈Python语言的动态性
http://www.cnblogs.com/sld666666/p/3519467.html
http://tianya23.blog.51cto.com/1081650/569798
http://www.devbean">
  
    <link rel="alternate" href="/atom.xml" title="Matrix207&#39;s Blog" type="application/atom+xml">
  
  
    <link rel="icon" href="/favicon.png">
  
  
    <link href="//fonts.googleapis.com/css?family=Source+Code+Pro" rel="stylesheet" type="text/css">
  
  <link rel="stylesheet" href="/css/style.css">
  

</head>

<body>
  <div id="container">
    <div id="wrap">
      <header id="header">
  <div id="banner"></div>
  <div id="header-outer" class="outer">
    <div id="header-title" class="inner">
      <h1 id="logo-wrap">
        <a href="/" id="logo">Matrix207&#39;s Blog</a>
      </h1>
      
    </div>
    <div id="header-inner" class="inner">
      <nav id="main-nav">
        <a id="main-nav-toggle" class="nav-icon"></a>
        
          <a class="main-nav-link" href="/">Home</a>
        
          <a class="main-nav-link" href="/archives">Archives</a>
        
      </nav>
      <nav id="sub-nav">
        
          <a id="nav-rss-link" class="nav-icon" href="/atom.xml" title="Flux RSS"></a>
        
        <a id="nav-search-btn" class="nav-icon" title="Rechercher"></a>
      </nav>
      <div id="search-form-wrap">
        <form action="//google.com/search" method="get" accept-charset="UTF-8" class="search-form"><input type="search" name="q" results="0" class="search-form-input" placeholder="Search"><button type="submit" class="search-form-submit">&#xF002;</button><input type="hidden" name="sitesearch" value="http://yoursite.com"></form>
      </div>
    </div>
  </div>
</header>
      <div class="outer">
        <section id="main"><article id="post-undefined" class="article article-type-post" itemscope itemprop="blogPost">
  <div class="article-meta">
    <a href="/work_diary/2015.html" class="article-date">
  <time datetime="2016-07-16T16:04:43.000Z" itemprop="datePublished">2016-07-17</time>
</a>
    
  </div>
  <div class="article-inner">
    
    
      <header class="article-header">
        
  
    <h1 class="article-title" itemprop="name">
      Work diary on 2015
    </h1>
  

      </header>
    
    <div class="article-entry" itemprop="articleBody">
      
        <h4 id="2015-11-15"><a href="#2015-11-15" class="headerlink" title="2015-11-15"></a>2015-11-15</h4><ul>
<li>study plugin architecture<ul>
<li><a href="http://www.cplusplus.com/articles/48TbqMoL/" target="_blank" rel="external">Making a Plugin System</a></li>
<li><a href="http://hgoldfish.com/blogs/article/81/" target="_blank" rel="external">如何设计插件式结构的程序，兼谈Python语言的动态性</a></li>
<li><a href="http://www.cnblogs.com/sld666666/p/3519467.html" target="_blank" rel="external">http://www.cnblogs.com/sld666666/p/3519467.html</a></li>
<li><a href="http://tianya23.blog.51cto.com/1081650/569798" target="_blank" rel="external">http://tianya23.blog.51cto.com/1081650/569798</a></li>
<li><a href="http://www.devbean.net/2012/05/building-your-own-plugin-framework-16/" target="_blank" rel="external">http://www.devbean.net/2012/05/building-your-own-plugin-framework-16/</a></li>
<li><a href="http://www.devbean.net/category/plugin/" target="_blank" rel="external">http://www.devbean.net/category/plugin/</a></li>
<li>plugin system <ul>
<li>vim</li>
<li>firefox</li>
</ul>
</li>
</ul>
</li>
</ul>
<h4 id="2015-11-05"><a href="#2015-11-05" class="headerlink" title="2015-11-05"></a>2015-11-05</h4><ul>
<li>Handle DTS</li>
<li>Fixed vimperator 3.9 not work on firefox 41.<ul>
<li>download source from <a href="https://github.com/vimperator/vimperator-labs" target="_blank" rel="external">https://github.com/vimperator/vimperator-labs</a></li>
<li>unzip and do make</li>
<li>open FireFox, install add-on from file, select vimperator-3.10.1.xpi</li>
</ul>
</li>
</ul>
<h4 id="2015-11-01"><a href="#2015-11-01" class="headerlink" title="2015-11-01"></a>2015-11-01</h4><ul>
<li>learn how to modify hosts file to surf on the net</li>
</ul>
<h4 id="2015-10-31"><a href="#2015-10-31" class="headerlink" title="2015-10-31"></a>2015-10-31</h4><ul>
<li>TODO: do monthly summary</li>
<li>extract version info from object</li>
<li>check all regression test case</li>
<li>check ST an UT</li>
</ul>
<h4 id="2015-10-26"><a href="#2015-10-26" class="headerlink" title="2015-10-26"></a>2015-10-26</h4><ul>
<li>add more unit test for data model module</li>
<li>gtest: test assert statement, <code>EXPECT_DEATH(function_call, &quot;&quot;)</code></li>
<li>thinking: how the S&amp;N module implementation</li>
</ul>
<h4 id="2015-10-25"><a href="#2015-10-25" class="headerlink" title="2015-10-25"></a>2015-10-25</h4><ul>
<li>And from the redis book, I have an idea that create structure image by graphiviz<br>next time for my design of feature story.</li>
<li>Maybe I will write something about VIM by phinx in some time, and maybe for company project also.</li>
<li>Study an example write book with phinx, see <a href="https://github.com/huangz1990/redisbook/" target="_blank" rel="external">https://github.com/huangz1990/redisbook/</a></li>
<li>Study Phinx, a tool that make it easy to create intelligent and beautiful documentation.</li>
<li>Study Redis from <a href="https://github.com/huangz1990/redisbook/" target="_blank" rel="external">https://github.com/huangz1990/redisbook/</a><ul>
<li>The SDS type give me a method to slove memory issue for company project</li>
</ul>
</li>
</ul>
<h4 id="2015-10-24"><a href="#2015-10-24" class="headerlink" title="2015-10-24"></a>2015-10-24</h4><ul>
<li>try to write more unit test for my own module.</li>
<li>try to write more unit test for my own module.</li>
<li>check DTS for iterator release.</li>
</ul>
<h4 id="2015-10-23"><a href="#2015-10-23" class="headerlink" title="2015-10-23"></a>2015-10-23</h4><ul>
<li>Handle four DTS.</li>
<li>Fix ST bug for can’t stop after start.</li>
<li>Fix a bug cause by my logic error of the submit code.</li>
<li>Rollback my submit code, to fix two issue which cause for another wrong fix.</li>
<li>How to mock memory allocate failure? Using macro to re-defined <code>malloc</code> is a possible way.</li>
</ul>
<h4 id="2015-10-09"><a href="#2015-10-09" class="headerlink" title="2015-10-09"></a>2015-10-09</h4><ul>
<li>vim, get current value of setting, <code>set dictionary?</code></li>
<li>think about version manager</li>
<li>download and build Lua, Readline</li>
</ul>
<h4 id="2015-10-08"><a href="#2015-10-08" class="headerlink" title="2015-10-08"></a>2015-10-08</h4><ul>
<li>using spf13-vim<ul>
<li><a href="http://blog.misilences.com/vim/2015/05/03/vim-accelerator-key" target="_blank" rel="external">http://blog.misilences.com/vim/2015/05/03/vim-accelerator-key</a></li>
<li><a href="http://www.cnblogs.com/zhea55/archive/2012/07/19/2598892.html" target="_blank" rel="external">http://www.cnblogs.com/zhea55/archive/2012/07/19/2598892.html</a></li>
<li><code>set scrolloff=0</code></li>
<li><code>let g:spf13_no_fastTabs=1</code> allow <code>H</code> to screen TOP and <code>L</code> to screen bottom</li>
<li>TODO : support dictionary</li>
</ul>
</li>
<li>install vim 7.4 by source code<ul>
<li>download v7.4.891 from <a href="https://github.com/vim/vim/releases" target="_blank" rel="external">https://github.com/vim/vim/releases</a></li>
<li>make, if require terminal library “ncurses”, do <code>yum install ncurses-devel</code></li>
<li>make install</li>
<li>compile vim support lua  <a href="http://blog.angluca.com/post/69566488641/编译vim和macvim带python和lua支持" target="_blank" rel="external">http://blog.angluca.com/post/69566488641/编译vim和macvim带python和lua支持</a><ul>
<li><code>./config --with-features=huge --enable-luainterp --with-lua-prefix=/usr/local</code></li>
<li><code>./src/vim --version |grep lua</code>, result is <code>-lua</code>, but expect <code>+lua/dyn</code></li>
</ul>
</li>
<li><code>./configure --prefix=/usr --with-features=huge --enable-rubyinterp --enable-pythoninterp --enable-luainterp --with-lua-prefix=/usr/local</code></li>
</ul>
</li>
<li>make plan of 10 month<ul>
<li>AC some OJ</li>
<li>schema version manager</li>
</ul>
</li>
</ul>
<h4 id="2015-07-25"><a href="#2015-07-25" class="headerlink" title="2015-07-25"></a>2015-07-25</h4><ul>
<li>flex<ul>
<li><a href="http://blog.chinaunix.net/uid-15145533-id-2775932.html" target="_blank" rel="external">词法分析器生成工具flex的简单使用</a></li>
</ul>
</li>
</ul>
<h4 id="2015-07-23"><a href="#2015-07-23" class="headerlink" title="2015-07-23"></a>2015-07-23</h4><ul>
<li>yacc lex<ul>
<li><a href="http://download.chinaunix.net/download/0013000/12144.shtml" target="_blank" rel="external">http://download.chinaunix.net/download/0013000/12144.shtml</a></li>
<li><a href="http://dinosaur.compilertools.net/#yacc" target="_blank" rel="external">http://dinosaur.compilertools.net/#yacc</a></li>
<li><a href="http://blog.csdn.net/towerjt/article/details/2255043" target="_blank" rel="external">http://blog.csdn.net/towerjt/article/details/2255043</a></li>
</ul>
</li>
</ul>
<h4 id="2015-07-22"><a href="#2015-07-22" class="headerlink" title="2015-07-22"></a>2015-07-22</h4><ul>
<li>编写schema解析工具</li>
<li>计划json文件自动生成工具</li>
<li>c实现自定义语法的词法扫描器<ul>
<li>如何定义一套既简单又能丰富表达要创建什么样的json文件的配置语言</li>
<li>在定义好之后，如果读取分析</li>
<li>分析完毕后调用jansson库自动生成json文件</li>
</ul>
</li>
</ul>
<h4 id="2015-07-21"><a href="#2015-07-21" class="headerlink" title="2015-07-21"></a>2015-07-21</h4><ul>
<li>schema解析代码分享</li>
</ul>
<h4 id="2015-07-20"><a href="#2015-07-20" class="headerlink" title="2015-07-20"></a>2015-07-20</h4><ul>
<li>看jansson代码，在avro中有</li>
</ul>
<h4 id="2015-06-24"><a href="#2015-06-24" class="headerlink" title="2015-06-24"></a>2015-06-24</h4><ul>
<li>O记 phone interview<ul>
<li>进程、线程最大区别，进程间通讯，fork，锁<ul>
<li>独立的内存空间</li>
<li>进程间同步: 消息队列、共享内存、管道、套接字(socket)</li>
<li>线程间同步: Event, Critical section, Mutex, Semaphore  </li>
</ul>
</li>
<li>内核数据通道，open系统调用过程，fd和磁盘文件关系<ul>
<li>描述层次关系</li>
<li>描述文件系统各个结构体关系</li>
</ul>
</li>
<li>makefile三个主要组成，环境变量操作影响<ul>
<li>目标、依赖、命令</li>
</ul>
</li>
<li>grep、sed、awk、find、统计代码行数，正则表达式<ul>
<li>wc -l 统计文件函数</li>
<li>统计source code代码行数可以使用find, xargs, wc, tail来实现</li>
<li>grep主要用来在某个文件或目录范围内查找字符串</li>
<li>sed主要用来修改文件</li>
<li>awk主要用来搜索匹配某个文件的信息</li>
<li>find查找文件</li>
</ul>
</li>
<li>变长数组实现</li>
<li>动态库和静态库的实现区别,如何定位要取的信息(地址)<ul>
<li>动态库，相对位置</li>
</ul>
</li>
<li>内存操作</li>
<li>gdb调试，常用功能命令，断点、单步，堆栈原理<ul>
<li>break</li>
<li>st</li>
<li>bt</li>
</ul>
</li>
<li>设计模式、单例, 如何获取唯一的指针<ul>
<li>构造函数私有, 类对象指针私有</li>
<li>定义一个public接口函数，在实现中使用一个静态的初始值为false的bool变量，<br>做if判断，如果第一次调用该函数就new一个该类的对象，赋给私有的对象指针，<br>然后修改布尔值为真，返回对象指针。</li>
</ul>
</li>
<li>网络编程，client与server通讯过程，轮询的使用<ul>
<li>connect，receive/send, bind,listen,accept,select,read/write,close,poll,epoll</li>
<li>select vs epoll</li>
<li>how epoll work</li>
</ul>
</li>
<li>存储性能瓶颈排查，top、vmstat、iostat、iftop、netstat</li>
<li>cpu高是否就表示软件有问题</li>
<li>网络问题，各种参数设定</li>
<li>举一个工作中性能优化的例子</li>
</ul>
</li>
</ul>
<h4 id="2015-06-11"><a href="#2015-06-11" class="headerlink" title="2015-06-11"></a>2015-06-11</h4><ul>
<li>重温《C专家编程》</li>
<li>重温《C++ Primer》</li>
</ul>
<h4 id="2015-06-10"><a href="#2015-06-10" class="headerlink" title="2015-06-10"></a>2015-06-10</h4><ul>
<li><a href="https://ramcloud.atlassian.net/wiki/display/RAM/Writing+Unit+Tests" target="_blank" rel="external">How to write a good unit test</a></li>
</ul>
<h4 id="2015-06-09"><a href="#2015-06-09" class="headerlink" title="2015-06-09"></a>2015-06-09</h4><ul>
<li>写python代码, 调用动态库接口函数<ul>
<li>然后通过函数参数回传值</li>
<li>如何获取动态方法的结构体参数数据</li>
<li>理解regex的match方法使用</li>
</ul>
</li>
<li>python写单元测试代码<ul>
<li><a href="https://docs.python.org/3.0/library/unittest.html" target="_blank" rel="external">unittest - unit test framwork</a></li>
<li><a href="http://www.cnblogs.com/coderzh/archive/2010/08/23/custom-python-unittestoutput-as-gtest.html" target="_blank" rel="external">让python的unittest像gtest一样输出</a></li>
<li><a href="http://blog.csdn.net/hackerain/article/details/24095117" target="_blank" rel="external">Python单元测试——深入理解unittest</a></li>
</ul>
</li>
</ul>
<h4 id="2015-06-08"><a href="#2015-06-08" class="headerlink" title="2015-06-08"></a>2015-06-08</h4><ul>
<li>写python代码, 调用动态库接口函数</li>
</ul>
<h4 id="2015-06-05"><a href="#2015-06-05" class="headerlink" title="2015-06-05"></a>2015-06-05</h4><ul>
<li>ramcloud<ul>
<li><a href="https://ramcloud.atlassian.net/wiki/display/RAM/RAMCloud;jsessionid=D118195965ABC5BF8B90B34EC242B5CE" target="_blank" rel="external">ramcloud</a></li>
<li><a href="http://blog.csdn.net/anzhsoft/article/details/21830991" target="_blank" rel="external">RAMCloud：内存云存储的内存分配机制</a></li>
</ul>
</li>
</ul>
<h4 id="2015-05-21"><a href="#2015-05-21" class="headerlink" title="2015-05-21"></a>2015-05-21</h4><ul>
<li>清理电脑</li>
</ul>
<h4 id="2015-05-20"><a href="#2015-05-20" class="headerlink" title="2015-05-20"></a>2015-05-20</h4><ul>
<li>请假</li>
</ul>
<h4 id="2015-05-19"><a href="#2015-05-19" class="headerlink" title="2015-05-19"></a>2015-05-19</h4><ul>
<li>继续交接usnmp, zd15</li>
</ul>
<h4 id="2015-05-18"><a href="#2015-05-18" class="headerlink" title="2015-05-18"></a>2015-05-18</h4><ul>
<li>转手上的两台Dell服务器加一个光纤网卡</li>
<li>继续讲解交接SCM</li>
<li>上班</li>
</ul>
<h4 id="2015-05-15"><a href="#2015-05-15" class="headerlink" title="2015-05-15"></a>2015-05-15</h4><ul>
<li>请假</li>
</ul>
<h4 id="2015-05-14"><a href="#2015-05-14" class="headerlink" title="2015-05-14"></a>2015-05-14</h4><ul>
<li>请假</li>
</ul>
<h4 id="2015-05-13"><a href="#2015-05-13" class="headerlink" title="2015-05-13"></a>2015-05-13</h4><ul>
<li>请假</li>
</ul>
<h4 id="2015-05-12"><a href="#2015-05-12" class="headerlink" title="2015-05-12"></a>2015-05-12</h4><ul>
<li>交接SDK、SCM和CI</li>
<li>上午请假</li>
</ul>
<h4 id="2015-05-11"><a href="#2015-05-11" class="headerlink" title="2015-05-11"></a>2015-05-11</h4><ul>
<li>请调休假</li>
</ul>
<h4 id="2015-05-08"><a href="#2015-05-08" class="headerlink" title="2015-05-08"></a>2015-05-08</h4><ul>
<li>请调休假</li>
</ul>
<h4 id="2015-05-07"><a href="#2015-05-07" class="headerlink" title="2015-05-07"></a>2015-05-07</h4><ul>
<li>准备固定资产转账</li>
<li>提交离职信</li>
<li>Hon SDK<ul>
<li>安装Cygwin, 选择gcc，make包</li>
<li>下载ipmitool 1.8.15<ul>
<li>./configure –enable-intf-lanplus</li>
<li>make </li>
</ul>
</li>
<li>安装Cygwin</li>
<li>BIOS BMC 设置 ipmi ip address, userid and password<ul>
<li>ipmitool -I lan -H 172.16.60.72 -U root -P 123456 sdr type ‘Power Unit’</li>
<li>ipmitool -I lan -H 172.16.60.72 -U root -P 123456 sdr type Temperature</li>
<li>ipmitool -I lan -H 172.16.60.72 -U root -P 123456 sdr type Fan</li>
</ul>
</li>
<li>参考 <a href="http://stackoverflow.com/questions/12907005/ipmitool-for-windows" target="_blank" rel="external">http://stackoverflow.com/questions/12907005/ipmitool-for-windows</a></li>
<li>参考 <a href="https://communities.intel.com/community/itpeernetwork/datastack/blog/2013/10/10/windows-users-can-use-ipmi-tools-too" target="_blank" rel="external">Data Center Management: Windows users can use IPMI tools too!</a></li>
</ul>
</li>
</ul>
<h4 id="2015-05-06"><a href="#2015-05-06" class="headerlink" title="2015-05-06"></a>2015-05-06</h4><ul>
<li>写工作交接文档</li>
<li>Hon SDK<ul>
<li>装windows server 2008</li>
<li>装MSM</li>
</ul>
</li>
</ul>
<h4 id="2015-05-05"><a href="#2015-05-05" class="headerlink" title="2015-05-05"></a>2015-05-05</h4><ul>
<li><a href="http://blog.2baxb.me/archives/1174" target="_blank" rel="external">理解 TCP/IP 网络栈 &amp; 编写网络应用</a></li>
<li><a href="http://www.cubrid.org/blog/dev-platform/understanding-tcp-ip-network-stack/" target="_blank" rel="external">Understanding TCP/IP Network Stack &amp; Writing Network Apps</a></li>
<li>讲解snmp给yangzc</li>
<li>研究怎么获取Intel主板硬件信息(温度、风扇、电源)<ul>
<li>ipmiutil, windows 安装，但没有办法用，说找不到imbdrv.sys或ipmidrv.sys. 可是明明就有.</li>
</ul>
</li>
</ul>
<h4 id="2015-05-04"><a href="#2015-05-04" class="headerlink" title="2015-05-04"></a>2015-05-04</h4><ul>
<li>研究怎么获取Intel主板硬件信息(温度、风扇、电源)<ul>
<li>OpenHardwareMonitor 7.0 也获取不到风扇信息</li>
</ul>
</li>
</ul>
<h4 id="2015-04-30"><a href="#2015-04-30" class="headerlink" title="2015-04-30"></a>2015-04-30</h4><ul>
<li>hostname问题<ul>
<li>ssh登陆刚装完系统的机器，做如下操作:<br>[root@yys ~]# hostname<br>yys<br>[root@yys ~]# hostname aaaa<br>[root@yys ~]# hostname<br>aaaa<br>[root@yys ~]# ip a<br>….（省略N行）<br>[root@yys ~]#<br>[root@yys ~]# ifconfig eth1 down<br>[root@yys ~]# hostname<br>yys  </li>
<li>可以看到执行ifconfig eth1 down后hostname又变回去了.</li>
<li><code>rpm -qf $(which hostname)</code></li>
<li>download net-tools-1.60.tar.bz2 <a href="http://www.linuxfromscratch.org/blfs/view/6.3/basicnet/net-tools.html" target="_blank" rel="external">http://www.linuxfromscratch.org/blfs/view/6.3/basicnet/net-tools.html</a><ul>
<li>hostname.c</li>
<li>ifconfig.c</li>
</ul>
</li>
<li>查看hostname.c, 发现是通过gethostname系统调用获取的<ul>
<li>gethostname定义在内核文件kernel/sys.c中, 通过调用<code>u = utsname();</code>获取。</li>
<li>utsname定义在include/linux/utsname.h中，函数返回的是<code>struct new_utsname</code></li>
<li>所以最终，hostname命令得到的是结构体<code>struct net_utsname</code>的nodename成员</li>
</ul>
</li>
<li>利用strace命令追查系统调用，<code>strace hostname</code>, <code>strace ifconfig</code></li>
<li>系统重启了，无法重新问题</li>
<li>涉及的配置文件和命令<ul>
<li>/etc/hosts</li>
<li>/etc/sysconfig/network</li>
<li>/proc/sys/kernel/hostname</li>
<li>sysctl kernel.hostname</li>
<li>/etc/rc.d/rc.sysinit</li>
</ul>
</li>
<li>参考 <a href="http://www.cnblogs.com/kerrycode/p/3595724.html" target="_blank" rel="external">深入理解Linux修改hostname</a></li>
<li>参考 <a href="http://www.cnblogs.com/hnrainll/archive/2011/05/07/2039686.html" target="_blank" rel="external">Linux struct utsname 结构详解</a></li>
</ul>
</li>
<li><a href="http://jingyan.baidu.com/article/27fa7326e6988846f8271fdf.html" target="_blank" rel="external">三才五格数理剖象法起名不靠谱</a></li>
</ul>
<h4 id="2015-04-29"><a href="#2015-04-29" class="headerlink" title="2015-04-29"></a>2015-04-29</h4><ul>
<li>OpenHardwareMonitor, 放到172.16.60.57上跑，没有CPU温度以及Fan信息</li>
<li>八字研究 </li>
</ul>
<h4 id="2015-04-28"><a href="#2015-04-28" class="headerlink" title="2015-04-28"></a>2015-04-28</h4><ul>
<li>清理110.125和110.121(现在是60.75)两台Dell服务器中的资料</li>
<li>Hon SDK 4 Intel mainboard<ul>
<li>一种可以尝试的方法是通过OpenHardwareMonitor获取风扇、电源和温度信息</li>
</ul>
</li>
<li>ustor centos-7 继续修改另外涉及的Makefile文件</li>
</ul>
<h4 id="2015-04-27"><a href="#2015-04-27" class="headerlink" title="2015-04-27"></a>2015-04-27</h4><ul>
<li>ustor centos-7, 解决LIO的一个编译警告”implicit declaration of function”. 原因<br>是，当前目录有个iscsi.h， 还有个lio/iscsi.h, 两个文件都是使用<code>#ifndef _ISCSI_H_</code><br>这就造成后面编译的lio/iscsi.h的函数声明直接被跳过了。<br>解决方法就是lio/iscsi.h的宏修改为<code>#ifndef _LIO_ISCSI_H_</code>即可  </li>
<li>Hon SDK 4 Intel mainboard<ul>
<li>原来的方法是通过读取超微的工具在系统日志中写的信息来获取</li>
<li>新的主板是Intel，超微的工具不能使用了。</li>
</ul>
</li>
<li>vim加密解密<ul>
<li>加密方法一<code>:set key=123456</code>, 然后保存退出<code>:wq</code></li>
<li>加密方法二<code>:X</code>, 然后输入密码两次，最后保存退出<code>:wq</code></li>
<li>删除密码<code>:set key=</code>, 然后保存退出<code>:wq</code></li>
</ul>
</li>
</ul>
<h4 id="2015-04-24"><a href="#2015-04-24" class="headerlink" title="2015-04-24"></a>2015-04-24</h4><ul>
<li>解决网卡顺序错误问题ucli nic_map<ul>
<li>使用到awk数组，使用字符串做数组序号，赋值后得到的数组顺序是乱的，要重新排序。<br>就用到asorti函数</li>
<li><code>cat /tmp/.nic |awk &#39;{print $1,$2}&#39;|awk &#39;{aa[$1]=aa[$1]&quot;,&quot;$2;asorti(aa,tA);}END{for(i in tA)print aa[tA[i]]}&#39;|sed &#39;s/^,//&#39;</code></li>
<li>参考 <a href="http://www.cnblogs.com/chengmo/archive/2010/10/09/1846696.html" target="_blank" rel="external">http://www.cnblogs.com/chengmo/archive/2010/10/09/1846696.html</a></li>
</ul>
</li>
<li>HUS <ul>
<li>提交性能测试记录</li>
</ul>
</li>
</ul>
<h4 id="2015-04-23"><a href="#2015-04-23" class="headerlink" title="2015-04-23"></a>2015-04-23</h4><ul>
<li>HUS <ul>
<li>8:55确认一切正常，昨天的10路回放已播放完毕，自动停止。</li>
<li>10:40停止原来的10路回放，开启另外10路的回放。</li>
<li>14:26检查一切ok, 已截图</li>
<li>17:13检查一切ok, 已截图</li>
<li>17:28 抽查最后一个扩展柜的视频文件播放ok</li>
</ul>
</li>
</ul>
<h4 id="2015-04-22"><a href="#2015-04-22" class="headerlink" title="2015-04-22"></a>2015-04-22</h4><ul>
<li>相关工作总结<ol>
<li>完成snmp windows开发</li>
<li>完成zd15 Linux版本开发</li>
<li>完成短信猫Linux接口研发</li>
<li>万兆网卡性能测试和支持</li>
</ol>
</li>
<li>HUS <ul>
<li>9:20确认一切正常，后面把10路回放给跑起来, 已截图</li>
<li>14:00查看发现<strong>有一路回放出现视频流播放失败</strong></li>
<li>15:00最后一个扩展柜的视频文件播放ok, 已截图</li>
<li>17:30检查一切ok, 已截图</li>
</ul>
</li>
<li>完成2015第一季度考核表格填写</li>
</ul>
<h4 id="2015-04-21"><a href="#2015-04-21" class="headerlink" title="2015-04-21"></a>2015-04-21</h4><ul>
<li>HUS<ul>
<li>存储100路, 转发60路，2Gbps 66%， CPU 44%, 内存1.57GB</li>
<li>重新调整机柜磁盘</li>
<li>原来的存储，一拖二<ul>
<li>主柜磁盘空</li>
<li>扩展柜1磁盘满, 24盘</li>
<li>扩展柜2磁盘满, 24盘</li>
</ul>
</li>
<li>调整后，一拖三<ul>
<li>主柜磁盘空</li>
<li>扩展柜1磁盘, 10盘</li>
<li>扩展柜2磁盘, 14盘</li>
<li>扩展柜3磁盘满, 24盘</li>
</ul>
</li>
<li>创建磁盘组, 设置如下: <ul>
<li>RAID 5</li>
<li>Strip Size 64KB </li>
<li>Disk Cache Policy : Disable</li>
<li>Read Policy : Always Read Ahead</li>
<li>IO Policy: Direct IO</li>
<li>Current Write Policy: Write Back</li>
<li>Default Write Policy: Always Write Back</li>
</ul>
</li>
<li>第1个磁盘组: 第1个扩张柜，10块磁盘，使用 9块建RAID，剩下1块作热备盘, 大小14.551TB</li>
<li>第2个磁盘组: 第2个扩张柜，14块磁盘，使用13块建RAID，剩下1块作热备盘, 大小21.826TB</li>
<li>第3个磁盘组: 第3个扩张柜，24块磁盘，使用23块建RAID，剩下1块作热备盘, 大小40.015TB</li>
</ul>
</li>
</ul>
<h4 id="2015-04-20"><a href="#2015-04-20" class="headerlink" title="2015-04-20"></a>2015-04-20</h4><ul>
<li>申离确认</li>
<li>HUS<ul>
<li>周五下午17:50测试到今天早上9:00，没有发现问题。视频回放估计因为已经播放完毕了<br>所以停止播放。没有发现视频流播放失败现象。</li>
<li>10:57, 录像增加到80路，此时2Gbps占用50%，CPU 40%，内存1.47GB, 看视频回放，发现<br>在10:49出现视频流播放失败，鉴于此先停止两路回放，当前回放路数为12路。但是当前的<br>网络差不多也就900Mbps左右，还不到1024Mbps</li>
<li>16:04, 转发30存储80回放12路，共122路，检查没有发现问题，CPU占用60%，内存1.50GB，网络930Mbps<br>根据这个记录，看起来是回放不能多(看起来超过14路就有问题), 存储路数可以增加。 </li>
</ul>
</li>
</ul>
<h4 id="2015-04-17"><a href="#2015-04-17" class="headerlink" title="2015-04-17"></a>2015-04-17</h4><ul>
<li>HUS<ul>
<li>测试记录<ul>
<li>回放15路，转发30路，NVR 2Gbps网络占用45% CPU占用63%, 内存使用1.43GB<br>经过一个晚上和一个早上的测试，下午过来发现出现很多的视频流播放失败。</li>
<li>回放12路，转发30路，NVR 2Gbps网络占用45% CPU占用63%, 内存使用1.48GB<br>14:30开始测试, 网络大概850Mbps</li>
<li>15:00, 码流模拟服务器(60.75)、控制中心VMS(60.224)被关机重启了，存储服务<br>器NVR(60.72)被关机了.实验室环境太恶劣。。。</li>
<li>15:30, 重新做测试, 回放12转发30存储64, CPU 75%+, 比较重，网络44%，内存1.22GB, </li>
<li>16:40, 重新做测试, 回放12转发30存储64, CPU 50%+, 网络44%，内存1.27GB, </li>
<li>17:50, 重新做测试, 回放12转发30存储64, CPU 50%+, 网络44%，内存1.25GB, </li>
</ul>
</li>
</ul>
</li>
</ul>
<h4 id="2015-04-16"><a href="#2015-04-16" class="headerlink" title="2015-04-16"></a>2015-04-16</h4><ul>
<li>HUS<ul>
<li>128路1080P@8Mbps并发录像+转发+回放, <code>128*8/8=128MB/s</code></li>
<li>512路D1@2Mbps的并发录像+转发+回放, <code>512*2/8=125MB/s</code></li>
<li>128路是指并发录像+转发+回放的总路数, <ul>
<li>比如说录像设备64路，转发30路，回放16路，那么就110路  </li>
<li>其中对于存储设备来说，录像的速率属于下行速率，转发+回放属于上行速率</li>
</ul>
</li>
<li>参考 <a href="http://www.zhihu.com/question/22877157" target="_blank" rel="external">http://www.zhihu.com/question/22877157</a></li>
<li>参考 <a href="http://www.chinastor.org/IP-SANCunChu/3242.html" target="_blank" rel="external">高清视频存储几大主流技术及存储难题</a></li>
<li>参考 <a href="http://www.2cto.com/kf/201304/204130.html" target="_blank" rel="external">数字视频监控技术基本术语</a></li>
<li>客户端看视频回放和转发是否正常，不能用远程桌面去看</li>
<li>测试记录<ul>
<li>使用64路设备做码流模拟</li>
<li>回放 0路，转发 0路，NVR 2Gbps网络占用26% CPU占用50%</li>
<li>回放21路，转发35路，NVR 2Gbps网络占用48% CPU占用75%, 视频流播放失败.</li>
<li>回放16路，转发30路，NVR 2Gbps网络占用45% CPU占用68%, 回放出现视频流创建失败错误.</li>
<li>回放12路，转发30路，NVR 2Gbps网络占用42% CPU占用60%, 视频播放ok.</li>
<li>回放15路，转发30路，NVR 2Gbps网络占用45% CPU占用63%, 内存使用1.43GB, 视频流播放失败.</li>
</ul>
</li>
</ul>
</li>
</ul>
<h4 id="2015-04-15"><a href="#2015-04-15" class="headerlink" title="2015-04-15"></a>2015-04-15</h4><ul>
<li>HUS<ul>
<li>怀疑cpu性能不足，直接把系统硬盘换到另外一台CPU比较好的机器上，但出现无法做网口绑定,<br>原来的分组无法删除.</li>
<li>新机器:<ul>
<li>Intel Xeon CPU E3-1230 v3 3.30GHz, 4核8线程</li>
<li>Intel I210 Gigabit Network</li>
</ul>
</li>
</ul>
</li>
</ul>
<h4 id="2015-04-14"><a href="#2015-04-14" class="headerlink" title="2015-04-14"></a>2015-04-14</h4><ul>
<li>HUS<ul>
<li>网络视频服务器下的设备修改存储时长，增加视频存储时间</li>
<li>测试回放： 客户端的实时视频，右键选择设备，播放视频 -&gt; HUS-NVR(不要选择直连视频)</li>
<li>不要看路数，看转发+存储+回放总码率是否达到1Gbps, 要做到这个还要做网口绑定</li>
<li>windows 2008 server r2 intel 82574L 网卡绑定<ul>
<li>驱动更新<a href="https://downloadcenter.intel.com/product/32210/Intel-82574-Gigabit-Ethernet-Controller" target="_blank" rel="external">https://downloadcenter.intel.com/product/32210/Intel-82574-Gigabit-Ethernet-Controller</a> </li>
<li>参考<a href="http://struggle.blog.51cto.com/333093/202363" target="_blank" rel="external">http://struggle.blog.51cto.com/333093/202363</a></li>
</ul>
</li>
<li>转发工具使用:<ul>
<li>server：NVR的IP地址</li>
<li>port：保持默认，不要修改</li>
<li>Cfg File：选择桌面上的VIPC_64或者VIPC_15，如果需要其他路数，请从VIPC_64中<br>选取需要的数量，另存为一个文件即可</li>
<li>Mode：选择TCP或者UDP均可，建议使用TCP</li>
<li>Client Count：填写数量要与使用的文件中记录的条数一致，比如选用VIPC_15的文<br>件，就填写15个，选用</li>
<li>VIPC_64的文件就填写64</li>
<li>ReConnect Time：保持默认0，不要修改</li>
<li>PS：STOP按钮有BUG，如果需要停止，请直接点击“Exit”按钮退出后重启打开<br>如果发现关闭转发测试工具后，仍然有转发码流存在，重启下NVR即可</li>
</ul>
</li>
<li>要求: 客户端实时视频，画面清晰，时间无跳秒, 存储2Gbps带宽使用率50%只是一个期望值</li>
<li>测试记录<ul>
<li>使用64路设备做码流模拟</li>
<li>回放 10路，转发16路，2Gbps网络占用36%, NVR CPU占用(没记录), 转发视频抽查是否跳帧(否)</li>
<li>回放 16路，转发16路，2Gbps网络占用38%, NVR CPU占用(没记录), 转发视频抽查是否跳帧(是)</li>
<li>回放 12路，转发16路，2Gbps网络占用37%, NVR CPU占用(没记录), 转发视频抽查是否跳帧(否)</li>
<li>回放 12路，转发31路，2Gbps网络占用43%, NVR CPU占用75%, 转发视频抽查是否跳帧(是)</li>
<li>回放 12路，转发21路，2Gbps网络占用39%, NVR CPU占用55%, 转发视频抽查是否跳帧(否)</li>
<li>回放 12路，转发20路，2Gbps网络占用39%, NVR CPU占用65%, 转发视频抽查是否跳帧(是)</li>
</ul>
</li>
</ul>
</li>
</ul>
<h4 id="2015-04-13"><a href="#2015-04-13" class="headerlink" title="2015-04-13"></a>2015-04-13</h4><ul>
<li>HUS 测试, 客户端无法播放多路视频<ul>
<li>AMD FirePro V3900, 装了9.003.3WinServer2008R2版本驱动,但dxdiag查不到驱动信息</li>
<li>安装了Win7, 发现远程桌面查看的dxdiag不支持一些功能，但是直接去机器上操作是支持的。</li>
<li>目前只能播放2路实时视频，无法做视频回放</li>
</ul>
</li>
</ul>
<h4 id="2015-04-10"><a href="#2015-04-10" class="headerlink" title="2015-04-10"></a>2015-04-10</h4><ul>
<li>HUS 测试, 1080P@8M 128路存储<ul>
<li>测试机器IP信息:<ul>
<li>存储服务器(NVR): 172.16.60.72, Intel Core i3-3220 CPU 3.30GHz, RAM 8GB</li>
<li>码流模拟服务器(VIPC): 172.16.60.75</li>
<li>管理中心服务器(VMC): 172.16.60.224 </li>
<li>客户端机器: 172.16.60.57</li>
</ul>
</li>
<li>码流服务器开了7个服务窗口，理论可以提供20x7=140路录像</li>
<li>当前测试路数是80, 有60路还没有加入录像规则</li>
<li>问题: 为什么码流服务器出现”live555 media server crash,please check the miniDump file”</li>
<li>存储服务器背板需要修改，先关闭系统。</li>
<li>1080P最多只能64路存储，模拟码流工具的文件如果用1080.264就是模拟1080P的码流</li>
<li>D1最多只能256路存储，模拟码流工具的文件如果用D1.264就是模拟D1的码流</li>
<li>注意路数限制，1080P的码流不能开太多，模拟前端和NVR都会崩溃的</li>
<li>码流模拟工具使用:<ul>
<li>打开VIPCServer.exe, 出现配置多个IP的对话框不管，直接关闭即可。</li>
<li>MediaServer，注意端口号，确定可用，然后点击”Start”</li>
<li>OnvifServer, 注意端口号，确定可用，取消”用户认证”<br>主码流和辅码流注意MediaServer选项跟左边MediaServer配置的端口号一致<br> 文件名称选择1080.264或D1.264</li>
<li>每启动一个MediaServer和OnvifServer,只支持22路码流, 通常只做20路支持。<br>所以要测试1080P@8M64路支持，就要设置4个不同的端口，打开4次服务，共8个控制台窗口。</li>
</ul>
</li>
<li>NVR设置</li>
<li>VMC设置</li>
<li>要求带宽(throughput)=1024Mbps，能够支持128路1080P@8Mbps并发录像+转发+回放或者512路D1@2Mbps的并发录像+转发+回放</li>
</ul>
</li>
</ul>
<h4 id="2015-04-09"><a href="#2015-04-09" class="headerlink" title="2015-04-09"></a>2015-04-09</h4><ul>
<li>LIO<ul>
<li>CHAP 权限登陆解决了，需要再tpg1下设置userid和password, 我原来时再acls下的iqn下设置的<br>这种方式是不对的。</li>
<li>好像iscsiadm 设置权限无法直接再/etc/iscsi/iscsid.conf设置生效，要用命令行操作:<br>iscsiadm -m node -T iqn.2007-10.lio.com:dg3.liolv1 -p 172.16.130.100 -o update –name node.session.auth.authmethod –value=CHAP<br>iscsiadm -m node -T iqn.2007-10.lio.com:dg3.liolv1 -p 172.16.130.100 -o update –name node.session.auth.username –value=alan<br>iscsiadm -m node -T iqn.2007-10.lio.com:dg3.liolv1 -p 172.16.130.100 -o update –name node.session.auth.password –value=123555<br>iscsiadm -m node -T iqn.2007-10.lio.com:dg3.liolv1 -p 172.16.130.100 –login  </li>
<li>下一个问题，解targetcli sessions问题</li>
</ul>
</li>
<li>Windows Server 2008 Standard Edition  64位版本最多支持32GB内存<br><a href="http://jingyan.baidu.com/article/22a299b52469ce9e19376ac8.html" target="_blank" rel="external">http://jingyan.baidu.com/article/22a299b52469ce9e19376ac8.html</a>  </li>
</ul>
<h4 id="2015-04-08"><a href="#2015-04-08" class="headerlink" title="2015-04-08"></a>2015-04-08</h4><ul>
<li>Windows Server 2008 R2 Standard: 4GGC4-9947F-FWFP3-78P6F-J9HDR, 试用期180天<br><a href="http://www.kwstu.com/ArticleView/419895180_2014123134259111" target="_blank" rel="external">http://www.kwstu.com/ArticleView/419895180_2014123134259111</a></li>
<li>HUS<ul>
<li>重新安装服务端</li>
</ul>
</li>
</ul>
<h4 id="2015-04-07"><a href="#2015-04-07" class="headerlink" title="2015-04-07"></a>2015-04-07</h4><ul>
<li>HUS<ul>
<li>服务端配置</li>
<li>模拟码流工具,也要需要单独机器，比较耗CPU，如果和服务端一起跑，估计跑不到256路 </li>
<li>客户端需要单独显卡，用于测试录像回放, 每起一个server，重新设置一个端口</li>
<li>码流工具<ul>
<li>一个server只支持22路，一般设置20路</li>
<li>1080P, 8M, 最多64路</li>
<li>D1, 2M, 最多256路</li>
</ul>
</li>
</ul>
</li>
</ul>
<h4 id="2015-04-03"><a href="#2015-04-03" class="headerlink" title="2015-04-03"></a>2015-04-03</h4><ul>
<li><a href="http://www.solidot.org/story?sid=43569" target="_blank" rel="external">寻找DDoS攻击GitHub的幕后组织</a><ul>
<li>TTL作用，用途</li>
</ul>
</li>
<li>HUS环境搭建<ul>
<li>U盘安装windows server 2008 standard</li>
<li>码流模拟服务器</li>
<li>存储阵列: 1.装“网络视频录像机” 2.MSM</li>
<li>服务器:</li>
<li><ol>
<li>安装Web Server IIS</li>
</ol>
</li>
<li><ol>
<li>安装消息队列</li>
</ol>
</li>
<li><ol>
<li>SQL Server 2008 Standard</li>
</ol>
<ul>
<li>功能全选</li>
<li>服务选择下拉框第一个</li>
<li>混合认证</li>
</ul>
</li>
<li><ol>
<li>装HUS服务组件</li>
</ol>
<ul>
<li>不选 “网络视频录像机”</li>
<li>不选 “容灾备份服务”</li>
<li>不选 “数据库管理工具”</li>
</ul>
</li>
<li>客户端: 全选HUS客户端</li>
<li>Licence </li>
</ul>
</li>
</ul>
<h4 id="2015-04-02"><a href="#2015-04-02" class="headerlink" title="2015-04-02"></a>2015-04-02</h4><ul>
<li>百度云盘默认只支持上传4G大小以内的文件，如想上传超过4G的大文件，必须开通VIP且<br>下载云管家客户端才能支持。参考 <a href="http://pan.baidu.com/disk/help" target="_blank" rel="external">帮助中心</a></li>
<li>LIO 打开pr_debug调试信息<ul>
<li>windows login成功了. <ul>
<li>iSCSI Initiator Properties –&gt; Logon</li>
<li>Log On to Target –&gt; Advanced…</li>
<li>Advanced Setting -&gt; “CHAP logon information”, 填写”User name:”和”Target secret”即可</li>
</ul>
</li>
</ul>
</li>
<li><a href="http://blog.jobbole.com/84478/" target="_blank" rel="external">如何在 Linux 下大量屏蔽恶意 IP 地址</a><ul>
<li>过滤单个IP地址使用<code>iptables -A INPUT -s 1.1.1.1 -p TCP -j DROP</code></li>
<li>过滤单个IP段使用<code>iptables -A INPUT -s 1.1.2.0/24 -p TCP -j DROP</code></li>
<li>使用ip集ipset <ul>
<li><code>ipset create banthis hash:net</code> 创建</li>
<li><code>ipset list</code> 显示所有</li>
<li><code>ipset add banthis 1.1.1.1</code> 增加IP</li>
<li><code>ipset add banthis 1.1.2.0/24</code> 增加IP段</li>
<li><code>ipset add banthis 1.1.5.0/24</code> 增加IP段</li>
<li><code>iptables -I INPUT -m set --match-set banthis src -p tcp --destination-port 80 -j DROP</code></li>
<li><code>ipset save banthis -f banthis.txt</code> 保存IP集到本地</li>
<li><code>ipset destroy banthis</code> 删除IP集</li>
<li><code>ipset restore banthis -f banthis.txt</code> 从本地IP集恢复</li>
</ul>
</li>
<li>IP地址黑名单: <a href="https://www.iblocklist.com/lists.php" target="_blank" rel="external">i-blocklist</a></li>
</ul>
</li>
</ul>
<h4 id="2015-04-01"><a href="#2015-04-01" class="headerlink" title="2015-04-01"></a>2015-04-01</h4><ul>
<li>linux kernel 打开 pr_debug调试信息<ul>
<li><a href="http://blog.csdn.net/helloanthea/article/details/25330809" target="_blank" rel="external">http://blog.csdn.net/helloanthea/article/details/25330809</a></li>
</ul>
</li>
<li>HUS 4.3<ul>
<li>SQL Server 2008 版本太低</li>
<li><a href="http://database.51cto.com/art/200910/155855.htm" target="_blank" rel="external">图解SQL Server 2008安装和配置过程</a><ul>
<li>选择混合认证，密码:XXX!XXX!NNNN</li>
</ul>
</li>
<li>安装sql server 2008时出现”microsoft.sql.chainer.package.PropertiesTypeProperty”<br>主要是因为在压缩包里点击的安装，解压后再安装就没有问题了。<br>参考 <a href="http://blog.chinaunix.net/uid-10239851-id-2967893.html" target="_blank" rel="external">http://blog.chinaunix.net/uid-10239851-id-2967893.html</a></li>
<li>rdesktop 连接 windows server 2008 出现 要求CredSSP的问题，修改远程属性:<br>选择 “允许运行任意版本远程桌面的计算机连接(较不安全)(L)“</li>
</ul>
</li>
</ul>
<h4 id="2015-03-31"><a href="#2015-03-31" class="headerlink" title="2015-03-31"></a>2015-03-31</h4><ul>
<li>HUS 4.3<ul>
<li>下载 sql server 2008 <a href="http://www.microsoft.com/en-us/download/confirmation.aspx?id=5023" target="_blank" rel="external">http://www.microsoft.com/en-us/download/confirmation.aspx?id=5023</a></li>
<li>下载 net framework 3.5 <a href="http://www.microsoft.com/zh-cn/download/confirmation.aspx?id=25150" target="_blank" rel="external">http://www.microsoft.com/zh-cn/download/confirmation.aspx?id=25150</a></li>
<li>下载 Windows Server 2008 R2 多语言支持<a href="http://www.microsoft.com/zh-cn/download/confirmation.aspx?id=1246" target="_blank" rel="external">http://www.microsoft.com/zh-cn/download/confirmation.aspx?id=1246</a> </li>
<li>安装 net framework 3.5 sp1</li>
<li>安装 teamviewer</li>
<li>sql server 2008 chs 无法安装，系统语言不支持</li>
</ul>
</li>
</ul>
<h4 id="2015-03-30"><a href="#2015-03-30" class="headerlink" title="2015-03-30"></a>2015-03-30</h4><ul>
<li>学习使用HUS4.3软件。<ul>
<li>Install MSMQ: <a href="https://msdn.microsoft.com/zh-cn/library/aa967729(v=vs.110).aspx)" target="_blank" rel="external">https://msdn.microsoft.com/zh-cn/library/aa967729(v=vs.110).aspx)</a></li>
<li>文档:<ul>
<li>Manual: 用户使用手册</li>
<li>MI: 安装指导手册</li>
</ul>
</li>
<li>要预备3台机器<ul>
<li>安装 Windows 2008 R2 64bit standard、SQL server 2008 standard、HUS-SVM, </li>
<li>安装 HUS-Client</li>
<li>安装 Windows 2008 R2 64bit standard、HUS-NVR</li>
</ul>
</li>
</ul>
</li>
<li>使用DDEBUG方式编译iscsi_target_mod模块， 但LIO所在的centos7挂掉了，启动不了。需要重装。</li>
</ul>
<h4 id="2015-03-28"><a href="#2015-03-28" class="headerlink" title="2015-03-28"></a>2015-03-28</h4><ul>
<li>关于debugfs, <a href="http://www.cnblogs.com/wwang/archive/2011/01/17/1937609.html" target="_blank" rel="external">Linux内核里的DebugFS</a></li>
<li>服务器的terminal中使用vim，在其他地方复制代码过来时候，会出现自动注释注释之后的代码<br>解决方法是在.vimrc中添加<code>set pastetoggle=&lt;F9&gt;</code>,用来固定粘贴的格式. gvim没有发现这个问题.  <ul>
<li>参考<a href="http://blog.csdn.net/CommShare/article/details/6215088" target="_blank" rel="external">vim黏贴代码格式混乱的解决方法</a></li>
</ul>
</li>
<li>★★★<strong>调试LIO内核代码:</strong><ul>
<li>使用printk, 类似: <code>printk(KERN_ERR &quot;Illegal value %d\n&quot;, flag);</code><br>#define KERN_EMERG    KERN_SOH “0”    /<em> system is unusable </em>/<br>#define KERN_ALERT    KERN_SOH “1”    /<em> action must be taken immediately </em>/<br>#define KERN_CRIT     KERN_SOH “2”    /<em> critical conditions </em>/<br>#define KERN_ERR      KERN_SOH “3”    /<em> error conditions </em>/<br>#define KERN_WARNING  KERN_SOH “4”    /<em> warning conditions </em>/<br>#define KERN_NOTICE   KERN_SOH “5”    /<em> normal but significant condition </em>/<br>#define KERN_INFO     KERN_SOH “6”    /<em> informational </em>/<br>#define KERN_DEBUG    KERN_SOH “7”    /<em> debug-level messages </em>/<br>打算使用KERN_DEBUG宏</li>
<li>由于最终是根据auth的naf_flags栏位来判断的，所以看函数调用过程中该段的设置情况。<br>iscsi_target_nego.c的函数iscsi_handle_authentication </li>
<li>[root@Ustor linux-3.10.0-123.el7]# modinfo iscsi_target_mod   查询模块路径<br>/lib/modules/3.10.0-123.el7.x86_64/kernel/drivers/target/iscsi/iscsi_target_mod.ko</li>
<li>cp /lib/modules/3.10.0-123.el7.x86_64/kernel/drivers/target/iscsi/iscsi_target_mod.ko{,.bak}<br>对原来的模块进行备份</li>
<li>停止target服务<code>service target stop</code>, 确认停止状态<code>service target status</code></li>
<li><code>lsmod |grep target</code> 查看所有的target相关模块<br>[root@Ustor linux-3.10.0-123.el7]# lsmod |grep target<br>target_core_pscsi      18810  0<br>target_core_file       18030  0<br>target_core_iblock     18177  0<br>iscsi_target_mod      278732  1<br>target_core_mod       299412  5 target_core_iblock,target_core_pscsi,iscsi_target_mod,target_core_file  </li>
<li><code>rmmod iscsi_target_mod</code> 无法删除模块, <code>rmmod: ERROR: Module iscsi_target_mod is in use</code></li>
<li>lsmod 查看到iscsi_target_mod的被使用(used by)数字是1，但是名单是空的，类似的<br>还有dm_mod,iptable_nat,不知道被谁用，就没有办法使用rmmod来删除。。。</li>
<li>抄了一个内核模块代码，检查iscsi_target_mod模块被使用造成无法删除的问题</li>
<li><a href="http://blog.csdn.net/zhangskd/article/details/7945140" target="_blank" rel="external">强力卸载内核模块</a><ul>
<li>注意以下两点:  </li>
<li>modules_which_use_me 已经不是module的成员，需要修改为source_list</li>
<li>local_set(<strong>module_ref_addr(mod,cpu),0); 不能使用,</strong>module_ref_addr已经不存在</li>
<li>现在没有使用代码修改引用次数，因为可能真的被使用了，强制修改可能导致内核挂掉.</li>
</ul>
</li>
<li>Makefile可以这样写: 参考<a href="http://blog.csdn.net/ghostyu/article/details/6869138" target="_blank" rel="external">http://blog.csdn.net/ghostyu/article/details/6869138</a><br>1 obj-m := mymod.o<br>2 KERNEL_DIR := /lib/modules/$(shell uname -r)/build<br>3 PWD := $(shell pwd)<br>4 all:<br>5         make -C $(KERNEL_DIR) SUBDIRS=$(PWD) modules<br>6 clean:<br>7         rm <em>.o </em>.ko *.mod.c<br>8<br>9 .PHONY:clean  </li>
<li><a href="http://www.cppblog.com/csjiaxin/articles/136382.html" target="_blank" rel="external">linux 强制删除内核模块(由于初始化错误导致rmmod不能删除)</a></li>
<li><a href="http://blog.csdn.net/dog250/article/details/6430818" target="_blank" rel="external">Linux内核模块的强制删除-结束rmmod这类disk sleep进程</a></li>
<li>内核一直在报xfs的错误:<br>[root@Ustor iscsi]# dmesg |tail<br>[169231.988879] used by NULL<br>[169231.988880] name:iscsi_target_mod state:0 refcnt:1<br>[169256.555688] XFS (dm-6): xfs_log_force: error 5 returned.<br>[169286.606509] XFS (dm-6): xfs_log_force: error 5 returned.<br>[169316.657311] XFS (dm-6): xfs_log_force: error 5 returned.<br>[169341.992366] [rmmod mymod] name:mymod state:2<br>[169346.708131] XFS (dm-6): xfs_log_force: error 5 returned.  </li>
<li>代码中有很多的pr_debug函数打印信息，怎么把开关打开呢?<ul>
<li><a href="https://www.kernel.org/doc/local/pr_debug.txt" target="_blank" rel="external">https://www.kernel.org/doc/local/pr_debug.txt</a>, add <code>CFLAGS_[filename].o := -DDEBUG</code> to makefile</li>
<li><a href="http://blog.chinaunix.net/uid-20746260-id-3044842.html" target="_blank" rel="external">http://blog.chinaunix.net/uid-20746260-id-3044842.html</a></li>
</ul>
</li>
</ul>
</li>
</ul>
<h4 id="2015-03-27"><a href="#2015-03-27" class="headerlink" title="2015-03-27"></a>2015-03-27</h4><ul>
<li>明天加入调试信息看看为什么CHAP验证不通过！</li>
<li>LIO的iscsi内核模块单独编译:<ul>
<li>搜索下载内核源码rpm: kernel-3.10.0-123.el7.src.rpm, 安装提取内核包源码, 解压</li>
<li>/root/linux-3.10.0-123.el7</li>
<li>cd /root/linux-3.10.0-123.el7 </li>
<li>make oldconfig &amp;&amp; make prepare </li>
<li>make scripts</li>
<li>make CONFIG_ISCSI_TARGET=m -C /root/linux-3.10.0-123.el7 M=drivers/target/iscsi<ul>
<li>注意，这里CONFIG_ISCSI_TARGET就是相对路径drivers/target/iscsi/下的Makefile中定义的</li>
<li>-C 参数值使用内核源码的绝对路径</li>
<li>M= 参数值使用模块源码的相对路径</li>
</ul>
</li>
</ul>
</li>
<li><a href="https://www.suse.com/zh-cn/documentation/sles11/stor_admin/data/sec_isns_overview.html" target="_blank" rel="external">iSNS作用和工作原理</a></li>
<li>解LIO Initiator CHAP auth login失败问题:  <ul>
<li><a href="http://files.cppblog.com/runsisi/iSCSI_CHAP认证.pdf" target="_blank" rel="external">iSCSI CHAP 认证过程</a></li>
<li>昨天看到/dev/shm/core/messages 打印 “CHAP user or password not set for Initiator ACL”</li>
<li>grep -rl “Initiator ACL” 找到文件 ./iscsi/iscsi_target_auth.c<br>pr_err(“CHAP user or password not set for”  <pre><code>&quot; Initiator ACL\n&quot;);  
</code></pre></li>
<li>由于这个打印是两个字符串拼凑起来的，所以如果使用grep整个字符串匹配查询会失败！</li>
<li>if (!(auth-&gt;naf_flags &amp; NAF_USERID_SET) || !(auth-&gt;naf_flags &amp; NAF_PASSWORD_SET))<br>检查struct iscsi_node_auth-&gt;naf_flags, 查看 iscsi_target_core.h, 共有四种值:<br>NAF_USERID_SET = 0x01,<br>NAF_PASSWORD_SET = 0x02,<br>NAF_USERID_IN_SET = 0x04,<br>NAF_PASSWORD_IN_SET = 0x08,<br>这里NAF是取自Node Auth Flag的首字母。  </li>
<li>函数调用过程: iscsi_target_start_negotiation -&gt; iscsi_target_do_login<br>-&gt; iscsi_target_handle_csg_zero -&gt; iscsi_target_do_authentication<br>-&gt; iscsi_handle_authentication -&gt; chap_main_loop -&gt; chap_server_open </li>
<li>iscsi_target_configfs.c </li>
<li>iscsi_target_tpg.c <ul>
<li>iscsit_tpg_add_network_portal</li>
</ul>
</li>
<li>iscsi_target.c <ul>
<li>iscsit_add_np</li>
</ul>
</li>
<li>登陆 iscsi_target_login.c <ul>
<li>iscsi_target_login_thread</li>
<li>__iscsi_target_login_thread</li>
</ul>
</li>
<li>协商 iscsi_target_nego.c <ul>
<li>iscsi_target_start_negotiation</li>
<li>iscsi_target_do_login</li>
<li>iscsi_target_handle_csg_zero</li>
</ul>
</li>
<li>权限 iscsi_target_auth.c <ul>
<li>chap_main_loop</li>
<li>chap_server_open</li>
</ul>
</li>
<li>LIO工作原理:<br>LIO对于一个LU，分配一个recv线程与一个send线程，recv线程接收Initiator发来的iSCSI PDU，<br>解析成SCSI请求后交给send线程，send线程将请求发给LU， 并将LU返回的结果返回给Initiator。<br>LIO的send线程与recv线程使用一个队列进行通信，该队列中的SCSI请求，有些不关心顺序，有些却关心，<br>这些都是在send线程遍历队列时才进行处理的。<br>参考 <a href="http://blog.chinaunix.net/uid-23242010-id-3749191.html" target="_blank" rel="external">分布式存储支持iSCSI协议调研</a></li>
</ul>
</li>
<li>ucli 进去执行 <code>cifs_service -a -c &quot;nas server&quot;...</code> 发现双引号的参数值被分割了<br>经过检查代码，发现是main函数在处理参数时就使用空格做了分割来token，然后再传递<br>给cifs_serivce函数，当然出现问题了。但是直接执行ucli cifs_service …就不会有<br>问题，因为这种方式再main中不会对参数处理，直接传递给cifs_service处理，所以不会有问题.</li>
<li>Set terminal title on Fedora 21<ul>
<li>我的版本GNOME Terminal 3.14.2， 貌似3.14版后移除了设置标题的功能. 替代方式是在<br>.bashrc中加入代码来实现。</li>
<li><a href="https://ask.fedoraproject.org/en/question/61169/how-to-rename-terminal-tab-in-fedora-21/" target="_blank" rel="external">How to rename terminal tab in Fedora 21</a></li>
<li><a href="http://unix.stackexchange.com/questions/177572/how-to-rename-terminal-tab-title-in-gnome-terminal" target="_blank" rel="external">How to rename terminal tab title in gnome-terminal?</a></li>
</ul>
</li>
</ul>
<h4 id="2015-03-26"><a href="#2015-03-26" class="headerlink" title="2015-03-26"></a>2015-03-26</h4><ul>
<li>LIO<ul>
<li>解决命令行设置CHAP AUTH没有生效问题</li>
<li>修改block为fileio</li>
<li>解chap登陆失败问题:<ul>
<li>/dev/shm/core/messages 打印 “CHAP user or password not set for Initiator ACL”</li>
</ul>
</li>
</ul>
</li>
<li>使用wireshark发现 172.16.50.10一直发送SSDP封包<ul>
<li>SSDP 协议是简单服务发现协议 (Simple Service Discovery Protocol) ，该协议定<br>义了如何在网络上发现网络服务的方法。 </li>
</ul>
</li>
<li>Test vmware tool on Fedora x86_64 <ul>
<li><a href="https://my.vmware.com/web/vmware/info/slug/desktop_end_user_computing/vmware_horizon_clients/3_0" target="_blank" rel="external">https://my.vmware.com/web/vmware/info/slug/desktop_end_user_computing/vmware_horizon_clients/3_0</a></li>
<li>安装： root权限, 然后执行<code>sh ./VMware-Horizon-Client-3.2.0-2331566.x86.bundle</code></li>
<li>卸载： root权限, <ul>
<li><code>sh ./VMware-Horizon-Client-3.2.0-2331566.x86.bundle -l</code> 显示产品名</li>
<li><code>sh ./VMware-Horizon-Client-3.2.0-2331566.x86.bundle -t</code> 显示模块名</li>
<li><code>sh ./VMware-Horizon-Client-3.2.0-2331566.x86.bundle -u vmware-horizon-client</code> 卸载</li>
</ul>
</li>
<li>更多信息<code>sh ./VMware-Horizon-Client-3.2.0-2331566.x86.bundle --help</code></li>
<li>或者gvim ./VMware-Horizon-Client-3.2.0-2331566.x86.bundle直接查看shell代码</li>
<li>这边下载安装了，但是命令行运行vmware-view提示缺少库，所以又卸载掉了。。。</li>
</ul>
</li>
<li>重新做磁盘组，建逻辑卷，LIO，内核还是报错，文件/dev/shm/core/messages：<ul>
<li>检查iscsi的连接： 发现很多TIME_WAIT<br>[root@Ustor ~]# netstat -apn |grep 3260<br>tcp    0    0 0.0.0.0:3260            0.0.0.0:*               LISTEN      -<br>tcp    0    0 172.16.130.100:3260     172.16.70.17:59983      TIME_WAIT   -<br>tcp    0    0 172.16.130.100:3260     172.16.70.17:59981      TIME_WAIT   -<br>tcp    0    0 172.16.130.100:3260     172.16.130.5:57426      TIME_WAIT   -<br>tcp    0    0 172.16.130.100:3260     172.16.70.17:59982      TIME_WAIT   -<br>tcp    0    0 172.16.130.100:3260     172.16.130.5:57391      TIME_WAIT   -  </li>
<li>初步判断出现那么多的iSCSI Login negotiation failed. 是因为该iscsi卷不存在。 </li>
<li>剩下的问题是登陆这些Initiator端机器确认下是否做了错误的连接。</li>
<li>已确认，确实是这两台机器的Initiator一直次重连，因为软件之前的做的连接还保留<br>但是T端已经修改了磁盘组和逻辑卷，导致重连失败，但是I端会一直发送连接登陆请求。<br>问题是LIO内核碰到这种情况能怎么办?只好一直打印lun不存在的事实。</li>
</ul>
</li>
</ul>
<h4 id="2015-03-25"><a href="#2015-03-25" class="headerlink" title="2015-03-25"></a>2015-03-25</h4><ul>
<li>一次无法连接<a href="https://github.com问题的解决过程" target="_blank" rel="external">https://github.com问题的解决过程</a><ul>
<li>把commit的结果提交到origin master分支出现如下错误:<br>[dennis@localhost matrix207.github.com]$ git push origin master<br>fatal: unable to access ‘<a href="https://github.com/matrix207/matrix207.github.com.git/" target="_blank" rel="external">https://github.com/matrix207/matrix207.github.com.git/</a>‘:<br>Could not resolve host: github.com </li>
<li>无法ping通www.baidu.com<br>[dennis@localhost ~]$ ping www.baidu.com<br>ping: unknown host www.baidu.com  </li>
<li>浏览器无法打开baidu主页</li>
<li>可以ping通网关172.16.50.1</li>
<li>可以ping通机器172.16.50.30</li>
<li>由于之前有做过traceroute www.baidu.com，所以知道网关的上层路由，以及外网的一些路由<ul>
<li>ping 219.134.89.153 ok</li>
<li>ping 10.1.100.37 ok</li>
<li>ping 121.15.130.18 ok</li>
<li>ping 8.8.8.8 ok</li>
</ul>
</li>
<li>通过以上分析，得到一个主要信息，通过ip地址是可以连通到外网，但是通过域名无法访问。<br>说明域名解析出现问题，查看网络设置，发现使用的dns有两个172.16.1.255,8.8.8.8<br>询问同事使用的DNS，是172.16.1.250. 修改255为250，重启网络service network restart，<br>问题解决！</li>
</ul>
</li>
<li>系统重启后，无/dev/dgXXX, 导致无法启动LIO服务<br>[root@Ustor ~]# grep -rn “/dev/“ /etc/target/saveconfig.json<br>338:      “dev”: “/dev/dg3/liolv2”,<br>369:      “dev”: “/dev/dg3/liolv1”,<br>400:      “dev”: “/dev/dg5/iscsi1”,<br>[root@Ustor ~]# ucli dg_query_all<br>dg5<br>dg3<br>count: 4<br>[root@Ustor ~]# ls /dev/r<br>random  raw/    rtc     rtc0<br>[root@Ustor ~]# ls /dev/d<br>dg5/  disk/ dm-0  dm-1  dri/<br>[root@Ustor ~]# service target start<br>Redirecting to /bin/systemctl start  target.service<br>Job for target.service failed. See ‘systemctl status target.service’ and ‘journalctl -xn’ for details.<br>[root@Ustor ~]# service target status<br>Redirecting to /bin/systemctl status  target.service<br>target.service - Restore LIO kernel target configuration<br>   Loaded: loaded (/usr/lib/systemd/system/target.service; disabled)<br>   Active: failed (Result: exit-code) since Wed 2015-03-25 15:39:56 CST; 5s ago<br>  Process: 4606 ExecStart=/usr/bin/targetctl restore (code=exited, status=1/FAILURE)<br> Main PID: 4606 (code=exited, status=1/FAILURE)<br>Mar 25 15:39:56 Ustor systemd[1]: target.service: main process exited, code=exited, status=1/FAILURE<br>Mar 25 15:39:56 Ustor systemd[1]: Failed to start Restore LIO kernel target configuration.<br>Mar 25 15:39:56 Ustor systemd[1]: Unit target.service entered failed state.  </li>
<li>查看哪些进程打开了 /dev/shm/core/messages<br>[root@Ustor ~]# lsof |grep ‘/core/messages’<br>rsyslogd    612         root    5w    REG   0,17    145664  16152 /dev/shm/core/messages<br>in:imuxso   612  747    root    5w    REG   0,17    145664  16152 /dev/shm/core/messages<br>in:imklog   612  748    root    5w    REG   0,17    145664  16152 /dev/shm/core/messages<br>rs:main     612  749    root    5w    REG   0,17    145664  16152 /dev/shm/core/messages<br>参考 <a href="http://www.ibm.com/developerworks/cn/aix/library/au-lsof.html" target="_blank" rel="external">http://www.ibm.com/developerworks/cn/aix/library/au-lsof.html</a>  </li>
<li>关于/dev/shm目录<ul>
<li>该目录是不存在磁盘，只存在内存中，</li>
<li>通过df -h和cat /proc/meminfo, 可以看到/dev/shm的大小是内存大小的一半.</li>
<li>参考: <a href="http://www.xifenfei.com/1605.html" target="_blank" rel="external">http://www.xifenfei.com/1605.html</a></li>
</ul>
</li>
<li>分析LIO，核态报错问题: 文件 /dev/shm/core/messages (r5,rd5,raid5这些磁盘组谁建的?)<br>Ustor kernel: [400406.256525] Unable to locate Target IQN: iqn.2007-10.lio.com:rd5.sc6 in Storage Node<br>Ustor kernel: [400406.256537] iSCSI Login negotiation failed.<br>Ustor kernel: [400406.256569] Unable to locate Target IQN: iqn.2007-10.lio.com:r5.sc3 in Storage Node<br>Ustor kernel: [400406.256576] iSCSI Login negotiation failed.<br>Ustor kernel: [400408.255101] Unable to locate Target IQN: iqn.2007-10.lio.com:raid5.sc1 in Storage Node<br>Ustor kernel: [400408.255115] iSCSI Login negotiation failed.  </li>
<li>继续对nfsd占用CPU较高问题进行回复:<ul>
<li>按照当前的CPU状态，系统的负载是比较重了，但是这个是iozone压力/性能测试，<br>实际业务环境是不是也是这样的情况呢？(也会有那么大的压 力？)<br>这个可能客户那边才清楚，所以50台或更多客户端，如果不是都这样使用iozone跑，应该不会有问题。  </li>
<li>即使使用iozone，按照万兆网卡跟磁盘的速度比，网络数据的流量没有上去(没有跑满万兆)，<br>磁盘的读写速度应该可以处理。  </li>
<li>随着客户端的增加，数据量增加，系统压力增加，cpu就更繁忙，nfsd的cpu占用率也应该<br>会上涨，但不会说跟着客户端的数量呈线性增长，如果这样nfs这样的文件系统也不会到<br>现在还一直流行； 可能的后果是系统会比较缓慢，但死机就应该不会.</li>
<li>还有几个问题需要深入了解下: <ul>
<li>nfsd只有8个，如果客户端增加，进程数不变吗? </li>
<li>nfs最多支持多少客户端，限制条件是什么?如何计算?</li>
<li>我们的存储产品都有哪些极限?带宽，磁盘IO，IOPS, 能承受的数据压力等等.</li>
</ul>
</li>
</ul>
</li>
<li>NFS 源码分析</li>
</ul>
<h4 id="2015-03-24"><a href="#2015-03-24" class="headerlink" title="2015-03-24"></a>2015-03-24</h4><ul>
<li>回复技术支持:<br>分析如下：<br>通过top命令看到wa的值，高的时候达到60%多，这说明CPU大部分时间都再等待IO完成。<br>测试环境是两台服务器使用iozone通过万兆网卡的连接，对存储机器进行读写测试。<br>读写速度有800MB/s以上，这样的负荷应该算蛮高了。<br>通过iostat查看到%util有时候达到100，说明磁盘已处于饱和状态。<br>这边找了一台其他的服务器测试，也是用iozone，使用nfs共享挂载方式，查看到nftd的使用率比较高（10%+）<br>所以，<br>1.nfsd占用cpu使用率的问题，在这样的测试环境下(大规模的读写测试)，应该属于正常。<br>2.wa值高，对于超过800MB的磁盘读写速度的测试环境来说，应该也差不多，至于是否<br>   同型号其他的产品比较低，只有客户这里的比较高，多少算合理，需要花时间研究整理。  </li>
<li>top显示当中wa值过高，可能的原因:<ul>
<li>首先可以确认的是，wa偏高，大于50%,说明cpu大部分时间都是再等IO操作完成</li>
<li>可能是由于磁盘性能瓶颈造成的</li>
<li>参考: <a href="http://bbs.51cto.com/thread-953213-1.html" target="_blank" rel="external">http://bbs.51cto.com/thread-953213-1.html</a></li>
</ul>
</li>
<li><a href="http://www.361way.com/cpuinfo/1510.html" target="_blank" rel="external">x86、i386、amd64、ia64的区别</a></li>
</ul>
<h4 id="2015-03-23"><a href="#2015-03-23" class="headerlink" title="2015-03-23"></a>2015-03-23</h4><ul>
<li>ps 中的D和Z<ul>
<li>D,往往是由于I/O资源得不到满足，而引发等待，在内核源码 fs/proc/array.c里，其文字定义为D(disk sleep) </li>
<li>Z,Zombie(僵尸)进程. ps -ef|grep defunc, 清除ZOMBIE（僵尸）进程可以使用如下方法： <ul>
<li>kill –18 PPID （PPID是其父进程）</li>
<li>kill –15 PID1 PID2(PID1,PID2是僵尸进程的父进程的其它子进程)。然后再kill父进程：kill –15 PPID </li>
<li><a href="http://blog.csdn.net/eroswang/article/details/1774298" target="_blank" rel="external">linux进程状态D和Z的处理</a></li>
</ul>
</li>
<li><a href="http://blog.xupeng.me/2009/07/09/linux-uninterruptible-sleep-state/" target="_blank" rel="external">Linux进程的Uninterruptible sleep(D)状态</a></li>
</ul>
</li>
<li>iostat<ul>
<li><a href="http://www.0550go.com/system/linux/iostat.html" target="_blank" rel="external">iostat</a></li>
</ul>
</li>
<li>top wa 占用58%, iostat %util 达100%, 两台服务器连接存储，使用IOZONE, 万兆网卡测试.<ul>
<li>第二行含义: <ul>
<li>us, user    : time running un-niced user processes</li>
<li>sy, system  : time running kernel processes</li>
<li>ni, nice    : time running niced user processes</li>
<li>wa, IO-wait : time waiting for I/O completion</li>
<li>hi : time spent servicing hardware interrupts</li>
<li>si : time spent servicing software interrupts</li>
<li>st : time stolen from this vm by the hypervisor</li>
</ul>
</li>
<li>top的wait高,平均负载高很明显就是CPU等待数据处理,瓶颈应该是在硬盘上</li>
<li>iostat中的%util代表一秒内IO操作所占的比例，计算公式是<code>(r/s+w/s)*(svctm/1000)</code></li>
<li><a href="http://blog.itpub.net/25923810/viewspace-1069071/" target="_blank" rel="external">iostat命令各列含义</a><ul>
<li>%util：i/o请求提交到设备期间的cpu时间百分比。近于100%则表明设备饱和</li>
</ul>
</li>
<li>NFS通常运行于2049端口</li>
<li><a href="http://www.cnblogs.com/mfryf/archive/2012/03/15/2397729.html" target="_blank" rel="external">top wa占用高，用iostat探个究竟</a></li>
<li><a href="http://blog.sina.com.cn/s/blog_6cf467320100m2t4.html" target="_blank" rel="external">TOP里 %wa、load average偏高的故障处理</a></li>
<li><a href="http://deidara.blog.51cto.com/400447/123300/" target="_blank" rel="external">iozone测试 nfs</a></li>
<li>IOZONE 3 397, 下载地址<ul>
<li><a href="http://www.iozone.org/src/current/" target="_blank" rel="external">http://www.iozone.org/src/current/</a></li>
<li><a href="http://www.iozone.org/src/current/iozone-3-397.src.rpm" target="_blank" rel="external">http://www.iozone.org/src/current/iozone-3-397.src.rpm</a></li>
<li>make linux-AMD64, 注意这里确认cpu类型，参考 <a href="http://www.361way.com/cpuinfo/1510.html" target="_blank" rel="external">http://www.361way.com/cpuinfo/1510.html</a></li>
</ul>
</li>
<li><a href="http://deidara.blog.51cto.com/400447/123300/" target="_blank" rel="external">IOZONE 测试 nfs</a><ul>
<li>showmount -e 172.16.130.111</li>
<li>ls /mnt</li>
<li>mkdir /mnt/nastest</li>
<li>mount -t nfs 172.16.130.111:/share/nfs1 /mnt/nastest</li>
</ul>
</li>
<li>客户测试参数: ./iozone -az -b /nas1/wuliji.xls -g 256G -y 32k -i 0 -i 1   </li>
<li>本地测试机，存储，神威， <ul>
<li>top : Cpu(s):  4.0%us, 32.0%sy,  0.0%ni, 35.5%id, 15.5%wa,  0.0%hi, 13.0%si,  0.0%st</li>
</ul>
</li>
<li>编译iostat : ./configure –build=sw_64-unknown-linux-gnu , make<ul>
<li>sysstat-10.1.5-4.el7.x86_64 </li>
<li><a href="http://sebastien.godard.pagesperso-orange.fr/download.html" target="_blank" rel="external">http://sebastien.godard.pagesperso-orange.fr/download.html</a></li>
<li>wget <a href="http://pagesperso-orange.fr/sebastien.godard/sysstat-11.0.2.tar.xz" target="_blank" rel="external">http://pagesperso-orange.fr/sebastien.godard/sysstat-11.0.2.tar.xz</a>  </li>
<li>wget <a href="https://github.com/sysstat/sysstat/archive/v11.0.2.tar.gz" target="_blank" rel="external">https://github.com/sysstat/sysstat/archive/v11.0.2.tar.gz</a> </li>
<li>tar zxvf sysstat-8.0.4.1.tar.gz<br>cd sysstat-8.0.4.1<br>./configure –build=sw_64-unknown-linux-gnu<br>make<br>make install  </li>
</ul>
</li>
<li><a href="http://veithen.github.io/2013/11/18/iowait-linux.html" target="_blank" rel="external">The precise meaning of I/O wait time in Linux</a></li>
<li><a href="http://serverfault.com/questions/12679/can-anyone-explain-precisely-what-iowait-is" target="_blank" rel="external">Can anyone explain precisely what IOWait is?</a></li>
<li>对于wa过高,最后我会给出一个便利的工具排查问题,你也可以通过下面这篇blog排除</li>
<li>★★★<strong><a href="http://bencane.com/2012/08/06/troubleshooting-high-io-wait-in-linux/" target="_blank" rel="external">Troubleshooting High I/O Wait in Linux</a></strong></li>
</ul>
</li>
<li>更新简历, 安装pandoc发现以来很多ghc包，看来pandoc可能使用haskell编写.</li>
<li><a href="https://coding.net/" target="_blank" rel="external">coding</a></li>
<li>汇报LIO工作进展:<br>通过上周加周六的努力，LIO代码已经上传至svn仓库的centos7分支，但代码整个功能<br>还有没完成的地方，总结如下：<ul>
<li>iscsi卷创建/删除/显示  【已完成】</li>
<li>chap用户创建/删除/显示 【已完成】</li>
<li>iscsi服务启用/禁用     【已完成】</li>
<li>io类型，目前使用的blockio，需要修改为fileio【修改代码即可】【难度系数0.1】</li>
<li>chap模式下Initiator登陆有问题              【待解决】【难度系数0.7+】</li>
<li>session查询显示有问题，好像不支持          【待核实】【难度系数0.7+】</li>
<li>估计需要3个工作日来处理以上问题</li>
</ul>
</li>
</ul>
<h4 id="2015-03-21"><a href="#2015-03-21" class="headerlink" title="2015-03-21"></a>2015-03-21</h4><ul>
<li>LIO，新加的代码好像有点问题，甚至CHAP好像没有生效！</li>
<li>iscsiadm<ul>
<li>查看session iscsiadm -m session</li>
<li>设置CHAP, vim /etc/iscsi/iscsid.conf </li>
<li>LIO 设置了CHAP权限，linux 使用 iscsiadm无法连接上，为什么?  </li>
<li>通过修改配置文件 /etc/iscsi/iscsid.conf， login失败.</li>
<li>通过命令操作，login 失败<br>[root@localhost ~]# iscsiadm -m node -T iqn.2007-10.lio.com:dg3.liolv1 -p 172.16.130.100 -o update –name node.session.auth.authmethod –value=CHAP<br>[root@localhost ~]# iscsiadm -m node -T iqn.2007-10.lio.com:dg3.liolv1 -p 172.16.130.100 -o update –name node.session.auth.username –value=alan<br>[root@localhost ~]# iscsiadm -m node -T iqn.2007-10.lio.com:dg3.liolv1 -p 172.16.130.100 -o update –name node.session.auth.password –value=123555<br>[root@localhost ~]# iscsiadm -m node -T iqn.2007-10.lio.com:dg3.liolv1 -p 172.16.130.100 –login<br>Logging in to [iface: default, target: iqn.2007-10.lio.com:dg3.liolv1, portal: 172.16.130.100,3260] (multiple)<br>iscsiadm: Could not login to [iface: default, target: iqn.2007-10.lio.com:dg3.liolv1, portal: 172.16.130.100,3260].<br>iscsiadm: initiator reported error (11 - iSCSI PDU timed out)<br>iscsiadm: Could not log into all portals  </li>
<li><a href="https://wiki.debian.org/SAN/iSCSI/open-iscsi" target="_blank" rel="external">https://wiki.debian.org/SAN/iSCSI/open-iscsi</a></li>
<li><a href="http://www.rootop.org/pages/2396.html" target="_blank" rel="external">http://www.rootop.org/pages/2396.html</a></li>
</ul>
</li>
<li>编辑iscsi配置文件，添加initiator单向认证<br>root@localhost ~]# vi /etc/iscsi/iscsid.conf<br>node.startup = automatic<br>node.session.auth.username = admin<br>node.session.auth.password = admin1234567890<br>[root@localhost ~]# service iscsi restart</li>
<li>LIO 无法查询到session信息！！！<ul>
<li>targetcli sessions 显示的是 (no open sessions)</li>
<li>通过<code>netstat -apn |grep 3260 |grep ESTABLISHED</code>可以看到连接的IP</li>
<li>执行 sessions 命令的代码:/lib/python2.7/site-packages/targetcli/ui_root.py, 函数ui_command_sessions </li>
<li>追寻到文件: /lib/python2.7/site-packages/rtslib_fb/root.py <ul>
<li>从代码上看，sessison是归属于node_acls,而node_acls属于tpgs,tpgs再属于targets</li>
<li>而当前的配置中,没有设置acls, 那么就不会有session了，如果设置就有了吗？</li>
</ul>
</li>
<li>追寻到文件: /lib/python2.7/site-packages/rtslib_fb/target.py </li>
</ul>
</li>
<li>原来的页面如何获取连接状态(客户端IP, InitiatorName, 存储IP， 状态)<ul>
<li>可能的显示<code>172.16.110.119  iqn.1994-05.com.redhat:4635fed69b24  172.16.130.114  active</code></li>
<li>使用firebug和grep定位文件: /opt/html/iscsi/iscsi_edit.php, 再找到函数iscsi_get_access_status </li>
<li>/opt/html/public/inc/iscsi_manager.inc, 执行<code>vd_query_conns -d $vgname -v $lvname</code></li>
<li>vd_mngt.c -&gt; iscsi.c, 读取/proc/net/iet/session信息</li>
</ul>
</li>
<li>加班[9:30 ~ 17:30]，LIO</li>
</ul>
<h4 id="2015-03-20"><a href="#2015-03-20" class="headerlink" title="2015-03-20"></a>2015-03-20</h4><ul>
<li>C语言宏：如果对宏参数使用了#或##，那么宏参数不会展开.<ul>
<li><a href="http://hbprotoss.github.io/posts/cyu-yan-hong-de-te-shu-yong-fa-he-ji-ge-keng.html" target="_blank" rel="external">C语言宏的特殊用法和几个坑</a><ul>
<li>字符串化: #define TOSTRING(x) #x</li>
<li>连接: #define COMMAND(NAME)  { #NAME, NAME ## _command }</li>
</ul>
</li>
</ul>
</li>
<li>LIO 功能实现和代码提交<ul>
<li>iscsi服务<ul>
<li>页面文件: option_iscsi.php, iscsi_set_status</li>
<li>页面文件: iscsi_manager.inc,iscsi_get_status-&gt;<code>iscsi_service -l</code>,iscsi_set_status-&gt;<code>iscsi_service -s</code></li>
<li>配置文件: /etc/cf/conf/iscsi.conf</li>
<li>代码文件: sys_mngt.c</li>
</ul>
</li>
<li>查询服务: ucli iscsi_service -l</li>
<li>启用服务: ucli iscsi_service -s enable<ul>
<li>system (“/etc/init.d/iscsi-target stop &gt;&amp;/dev/null”);</li>
<li>system (“/etc/init.d/iscsi-target stop &gt;&amp;/dev/null”);</li>
<li>system (“/etc/init.d/iscsi-target start”);</li>
</ul>
</li>
<li>禁用服务: ucli iscsi_service -s disable<ul>
<li>system (“/etc/init.d/iscsi-target stop &gt;&amp;/dev/null”);</li>
<li>system (“/etc/init.d/iscsi-target stop &gt;&amp;/dev/null”);</li>
</ul>
</li>
<li>网络设置后，还要做iscsi服务启动的操作。</li>
<li><strong>保留原有流程和配置，修改<code>/etc/init.d/iscsi-target star|stop</code>为<code>service target start|stop</code></strong><ul>
<li>不存在/etc/init.d/target，但是可以通过service target start|stop运行，最后是<br>重定向到/bin/systemctl start|stop|status  target.service</li>
<li><strong>出现/etc/init.d/iscsi-target 都要修改</strong></li>
</ul>
</li>
<li><strong>修改获取iscsi服务状态代码:<code>get_iscsi_service_status</code></strong></li>
<li>另外激活iscsi服务的时候还要跑vd_recover (0, NULL)<ul>
<li>vd_recover(0,NULL) -&gt;vd_recover_iscsi (vd-&gt;dg, vd-&gt;name) -&gt; <code>vgchange -ay</code> 设置卷组为活动状态</li>
<li>iscsi_get_attr </li>
<li>iscsi_target_recovert </li>
</ul>
</li>
</ul>
</li>
</ul>
<h4 id="2015-03-19"><a href="#2015-03-19" class="headerlink" title="2015-03-19"></a>2015-03-19</h4><ul>
<li>★★★<strong><a href="http://javascript.ruanyifeng.com/" target="_blank" rel="external">JavaScript 标准参考教程（alpha）</a></strong></li>
<li>磁盘容量<ul>
<li>柱面</li>
<li>磁道</li>
<li>扇区</li>
<li><code>磁盘容量 = 柱面 * 磁道 * 扇区 * 512 Bytes</code></li>
<li>hdparm -I /dev/sda 查看磁盘信息</li>
<li>例子:<br>[root@Ustor ~]# hdparm -I /dev/sda<br>Logical       max   current<br>cylinders     15525 15525<br>heads         16    16<br>sectors/track 63    63<br>[root@Ustor ~]# echo 15525<em>16</em>63<em>512/1024/1024 |bc<br>7641<br>根据磁盘信息计算得到磁盘的容量为7641MB, 可以通过fdisk -l确认下。<br>[root@Ustor ~]# fdisk -l /dev/sda<br>Disk /dev/sda: 8012 MB, 8012390400 bytes<br>255 heads, 63 sectors/track, 974 cylinders<br>Units = cylinders of 16065 </em> 512 = 8225280 bytes<br>Sector size (logical/physical): 512 bytes / 512 bytes<br>I/O size (minimum/optimal): 512 bytes / 512 bytes<br>但是发现fdisk -l得到的是8012MB, 不对啊，原来这个计算的是十进制的值！奸商！<br>[root@Ustor ~]# echo 15525<em>16</em>63<em>512 |bc<br>8012390400<br>[root@Ustor ~]# echo 15525</em>16<em>63</em>512/1000/1000 |bc<br>8012<br>其实hdparm有显示了:<br>[root@Ustor ~]# hdparm -I /dev/sda |grep -i “device size with M”<br>device size with M = 1024<em>1024:        7641 MBytes<br>device size with M = 1000</em>1000:        8012 MBytes (8 GB)  </li>
</ul>
</li>
<li>存储机器网络无法连接<ul>
<li>ip addr, 有ip地址，启动状态，route -n, 路由信息ok</li>
<li>ping 172.16.130.1， 无法ping通网关</li>
<li>service network restart, 重新启动网络服务，再使用ifconfig 配置ip，以及route add<br>加入路由信息，网络正常了。</li>
<li>查看内核信息 vim /dev/shm/core/messages, 发现如下信息:<br>Mar 19 02:19:28 Ustor kernel: frm_size=56, mbx_size=256<br>Mar 19 02:19:29 Ustor kernel: set event class to 0<br>Mar 19 02:19:29 Ustor kernel: megasas_start_aen: seq_num=12737<br>Mar 19 02:19:29 Ustor kernel: megasas_register_aen[6]: already registered<br>Mar 19 02:19:29 Ustor kernel: megasas_register_aen ret=0<br>Mar 19 03:22:42 Ustor kernel: irq 33: nobody cared (try booting with the “irqpoll” option)<br>Mar 19 03:22:42 Ustor kernel: Pid: 0, comm: swapper Not tainted 2.6.32-279.el6.x86_64 #3<br>Mar 19 03:22:42 Ustor kernel: Call Trace:<br>Mar 19 03:22:42 Ustor kernel: <irq>  [<ffffffff810dcd8b>] ? __report_bad_irq+0x2b/0xa0<br>Mar 19 03:22:42 Ustor kernel: [<ffffffff810dcf8c>] ? note_interrupt+0x18c/0x1d0<br>Mar 19 03:22:42 Ustor kernel: [<ffffffff810dd555>] ? handle_edge_irq+0xf5/0x180<br>Mar 19 03:22:42 Ustor kernel: [<ffffffff8100df09>] ? handle_irq+0x49/0xa0<br>Mar 19 03:22:42 Ustor kernel: [<ffffffff81503b2c>] ? do_IRQ+0x6c/0xf0<br>Mar 19 03:22:42 Ustor kernel: [<ffffffff8100ba53>] ? ret_from_intr+0x0/0x11<br>Mar 19 03:22:42 Ustor kernel: <eoi>  [<ffffffff812f522a>] ? acpi_idle_enter_c1+0xa3/0xc1<br>Mar 19 03:22:42 Ustor kernel: [<ffffffff812f5209>] ? acpi_idle_enter_c1+0x82/0xc1<br>Mar 19 03:22:42 Ustor kernel: [<ffffffff81405667>] ? cpuidle_idle_call+0xa7/0x140<br>Mar 19 03:22:42 Ustor kernel: [<ffffffff81009e06>] ? cpu_idle+0xb6/0x110<br>Mar 19 03:22:42 Ustor kernel: [<ffffffff814f4d1f>] ? start_secondary+0x22a/0x26d<br>Mar 19 03:22:42 Ustor kernel: handlers:<br>Mar 19 03:22:42 Ustor kernel: [<ffffffffa00e3160>] (e1000_msix_other+0x0/0x1f0 [e1000e])<br>Mar 19 03:22:42 Ustor kernel: Disabling IRQ #33<br>Mar 19 03:22:57 Ustor kernel: frm_size=56, mbx_size=256<br>Mar 19 03:23:01 Ustor kernel: set event class to 0<br>Mar 19 03:23:01 Ustor kernel: megasas_start_aen: seq_num=12738  </ffffffffa00e3160></ffffffff814f4d1f></ffffffff81009e06></ffffffff81405667></ffffffff812f5209></ffffffff812f522a></eoi></ffffffff8100ba53></ffffffff81503b2c></ffffffff8100df09></ffffffff810dd555></ffffffff810dcf8c></ffffffff810dcd8b></irq></li>
<li>搜查内核代码<br>[dennis@localhost linux-2.6.32-279.el6]$ grep -rl e1000_msix_other ./<br>./drivers/net/e1000e/netdev.c<br>[dennis@localhost linux-2.6.32-279.el6]$ grep -rl “nobody cared “ ./<br>./kernel/irq/spurious.c<br>[dennis@localhost linux-2.6.32-279.el6]$ grep -rl irqpoll ./<br>./Documentation/kernel-parameters.txt<br>./Documentation/kdump/kdump.txt<br>./drivers/net/tg3.c<br>./kernel/irq/spurious.c  </li>
<li><code>Pid: 0, comm: swapper Not tainted 2.6.32-279.el6.x86_64 #3</code> 由arch/x86/kenel/process.c的<br>函数show_regs_common打印.</li>
<li>eth0使用的是e1000e驱动<br>[root@Ustor ~]# ethtool -i eth0<br>driver: e1000e<br>version: 2.1.4-NAPI<br>firmware-version: 2.1-2<br>bus-info: 0000:03:00.0  </li>
<li>./drivers/net/e1000e/netdev.c : e1000_netpoll -&gt; e1000_intr_msix -&gt; e1000_msix_other </li>
<li>查看系统中断信息,可以看到33号中断是由eth0产生.<br>[root@Ustor ~]# grep 33: /proc/interrupts<br> 33:      53026     146978   PCI-MSI-edge      eth0<br>[root@Ustor ~]# ls /proc/irq/34<br>affinity_hint  megasas  node  smp_affinity  smp_affinity_list  spurious<br>[root@Ustor ~]# ls /proc/irq/33<br>affinity_hint  eth0  node  smp_affinity  smp_affinity_list  spurious<br>[root@Ustor ~]# ls /proc/irq/32<br>affinity_hint  eth0-tx-0  node  smp_affinity  smp_affinity_list  spurious<br>[root@Ustor ~]# ls /proc/irq/31<br>affinity_hint  eth0-rx-0  node  smp_affinity  smp_affinity_list  spurious<br>[root@Ustor ~]# ls /proc/irq/30<br>affinity_hint  eth3  node  smp_affinity  smp_affinity_list  spurious<br>[root@Ustor ~]# ls /proc/irq/29<br>affinity_hint  eth2  node  smp_affinity  smp_affinity_list  spurious<br>[root@Ustor ~]# ls /proc/irq/28<br>affinity_hint  eth1  node  smp_affinity  smp_affinity_list  spurious  </li>
<li><a href="http://lxr.free-electrons.com/source/Documentation/zh_CN/IRQ.txt" target="_blank" rel="external">http://lxr.free-electrons.com/source/Documentation/zh_CN/IRQ.txt</a></li>
<li><a href="http://www.vpsee.com/2010/07/load-balancing-with-irq-smp-affinity/" target="_blank" rel="external">Linux多核下绑定硬件中断到不同CPU（IRQ Affinity）</a></li>
<li><a href="http://rfyiamcool.blog.51cto.com/1030776/1335700" target="_blank" rel="external">http://rfyiamcool.blog.51cto.com/1030776/1335700</a></li>
<li><a href="http://blog.csdn.net/lucien_cc/article/details/7522618" target="_blank" rel="external">http://blog.csdn.net/lucien_cc/article/details/7522618</a></li>
<li><a href="http://michaelkang.blog.51cto.com/1553154/1265232" target="_blank" rel="external">http://michaelkang.blog.51cto.com/1553154/1265232</a></li>
<li><a href="http://mnstory.net/2014/12/e1000e-driver-source-analysis/" target="_blank" rel="external">e1000e驱动源码分析</a></li>
<li><a href="http://zh.wikipedia.org/zh/中斷" target="_blank" rel="external">http://zh.wikipedia.org/zh/中斷</a></li>
<li>出现这样的信息是不是就表示网口eth0出现问题，驱动模块出问题了？网络出问题了？<br>会不会出现该问题，网络驱动模块退出了？  下次记得检查完了再重新启动网络<br>构建再网络上的应用就无法正常通讯了？ 待查！   </li>
</ul>
</li>
<li><a href="http://www.5ilinux.com/2013/08/dd_benchmark.html" target="_blank" rel="external">正确用DD测试磁盘读写速度</a><ul>
<li><code>dd bs=1M count=256 if=/dev/zero of=test</code> 只是得到把数据写入内存的速度。最快</li>
<li><code>dd bs=1M count=256 if=/dev/zero of=test; sync</code> 得到的速度同上，sync是得到速度后的操作。 </li>
<li><code>dd bs=1M count=256 if=/dev/zero of=test conv=fdatasync</code> 数据写入内存，加最后一次性同步到磁盘的速度。合理</li>
<li><code>dd bs=1M count=256 if=/dev/zero of=test oflag=dsync</code> 每次数据写入内存后，同步写磁盘。最慢</li>
</ul>
</li>
</ul>
<h4 id="2015-03-18"><a href="#2015-03-18" class="headerlink" title="2015-03-18"></a>2015-03-18</h4><ul>
<li>关于raid<ul>
<li>raid0, 多块磁盘并排成一个大的磁盘使用，读写速度是单盘的n倍</li>
<li>raid1，<ul>
<li>两块盘的情况下, 写性能最高只能达到一块盘的速度，读性能可以达到单盘的两倍.  </li>
<li>多盘，写速度=n/2, 假设有8块盘，a1,a2~a8, 写速度只有4*a1,(8块同样的磁盘)</li>
<li>多盘，读速度=n, 假设有8块盘，a1,a2~a8, 读速度有8*a1,(8块同样的磁盘)</li>
</ul>
</li>
<li>raid5</li>
<li>raid6</li>
<li>raid10</li>
<li><a href="http://www.dbabeta.com/2009/io-performence-02_cache-and-raid.html" target="_blank" rel="external">http://www.dbabeta.com/2009/io-performence-02_cache-and-raid.html</a></li>
</ul>
</li>
<li><a href="http://wushank.blog.51cto.com/3489095/1585927" target="_blank" rel="external">linux下的CPU、内存、IO、网络的压力测试</a><ul>
<li>CPU简单测试： <code>echo &quot;scale=5000; 4*a(1)&quot; | bc -l -q</code></li>
<li>内存简单测试： <code>memtester 1G 5</code></li>
<li>IO简单测试： <ul>
<li><code>time dd if=/dev/zero of=/tmp/test bs=1M count=4096</code></li>
<li>fio</li>
<li>iozone</li>
</ul>
</li>
<li>网络测试工具iperf</li>
</ul>
</li>
<li>shenwei net-snmp<ul>
<li>./configure –prefix=/usr/ –host=sw_64-unknown-linux-gnu </li>
</ul>
</li>
<li>磁盘速度就是磁盘带宽?</li>
<li><a href="https://community.emc.com/message/758173" target="_blank" rel="external">单个磁盘可提供的带宽有多少？</a><ul>
<li>FC<ul>
<li>FC 15 krpm: 12 MB/s and 180 IOPS</li>
<li>FC 10 krpm: 10 MB/s and 140 IOPS</li>
<li>SATA2 7.2 krpm: 8 MB/s and 80 IOPS</li>
<li>ATA 7.2 krpm: 7 MB/s and 60 IOPS</li>
<li>ATA 5.4 krpm: 7 MB/s and 50 IOPS</li>
<li>EFD (flash): 100 MB/s and 2500 IOPS</li>
</ul>
</li>
<li>SAS:<ul>
<li>Flash drives(Solid State Device): capable of around 250MB/s and 3000 IOPS</li>
<li>15K SAS dirves: capable of around 50 MB/s and 180 IOPS</li>
<li>10K SAS dirves: capable of around 35 MB/s and 140 IOPS</li>
<li>7200 rpm Near-Line SAS drives: capable of around 25 MB/s and 90 IOPS</li>
</ul>
</li>
</ul>
</li>
<li><strong><a href="http://blog.csdn.net/dba_waterbin/article/details/8939997" target="_blank" rel="external">关注磁盘的两个指标：IOPS和传输带宽（吞吐量）</a></strong><ul>
<li>如何才算一次IO呢?<br>因为系统由一个个层次模块组合而成,每个模块都有各自的接口,而在接口间流动的数据就是IO<br>但是各个模块都各自为政,都有自己一次IO的定义,所以一次IO要在具体模块内才有意义.</li>
<li>总结:<ul>
<li><strong>高传输带宽在传输大块连续数据时具有优势</strong></li>
<li><strong>高IOPS在传输小块不连续的数据时具有优势</strong></li>
</ul>
</li>
</ul>
</li>
<li>吞吐量(带宽)<ul>
<li>数据吞吐量(Throughput)</li>
<li>单个磁盘可提供的带宽有多少?</li>
<li>网卡带宽: 一块千兆网卡的实际速率=1024Mb/s / 8=128MB/s</li>
</ul>
</li>
<li><strong>IOPS 计算</strong><ul>
<li>IOPS = Input Output Per Second, 即每秒的输入输出量(读写次数)</li>
<li>IOPS是指单位时间内系统能处理的I/O请求数量，一般以每秒处理的I/O请求数量为单位，I/O请求通常为读或写数据操作请求</li>
<li>与IOPS有直接关系的部分: 寻道时间tseek，旋转延迟trotation，数据传输时间transfer<ul>
<li>tseek: Tseek是指将读写磁头移动至正确的磁道上所需要的时间, 一般磁盘寻道时间范围3~15ms</li>
<li>trotation:是指盘片旋转将请求数据所在扇区移至读写磁头下方所需要的时间, 对于  <pre><code>转速是7200rpm(Revolutions Per minute)的, 60*1000/7200/2=4.17ms,  
转速是15000rpm, 则60*1000/15000/2=2ms,
</code></pre></li>
<li>transfer:是指完成传输所请求的数据所需要的时间, IDE/ATA能达到133MB/s，SATA II可达到300MB/s的接口数据传输率   <pre><code>Transfer = IO Chunk Size / Max Transfer Rate  
假设IO大小为64KB,磁盘接口速率100MB/s，那么Transfer = 64KB/100MB/s = 0.000625s = 0.625ms  
由于一般IO大小不会很大(小于64KB?), 且磁盘接口速率会越来越快，所以transfer的值一般小于1
</code></pre></li>
</ul>
</li>
<li>IOPS=1000/(tseek+trotation+transfer)  <ul>
<li>对于常用的机械硬盘, IOPS = 1000/(5ms + 2ms) = 142 (5ms取个比较小的值，2ms对应15krpm, transfer小于1可以忽略</li>
<li>对于固态硬盘, 没有旋转，忽略了寻道，传输速率可以达到300MB/s，<br>IOPS = 1000ms/(64KB/300MB/s) = 4687 (这里假设IO大小64KB, SSD接口速率为300MB/s)</li>
<li>可见对于SSD，每秒完成的IO操作比常规硬盘快的多.</li>
</ul>
</li>
<li>对于机械硬盘，对于顺序读写(即几乎不需要寻道和旋转操作的情况), IOPS会怎样呢?, 假设磁盘接口速率100MB/s<ul>
<li>4K  : 1000/(4/100) = 25000</li>
<li>16K : 1000/(16/100) = 6250</li>
<li>32K : 1000/(32/100) = 3125</li>
<li>64K : 1000/(64/100) = 1562</li>
<li>可见对于小的IO大小(是否代表对应小文件?), IOPS最大</li>
</ul>
</li>
<li><a href="http://blog.csdn.net/liuaigui/article/details/6168186" target="_blank" rel="external">磁盘IOPS计算与测量</a></li>
<li><a href="http://dadaru.blog.51cto.com/218979/481394" target="_blank" rel="external">http://dadaru.blog.51cto.com/218979/481394</a></li>
<li><a href="http://dadaru.blog.51cto.com/218979/481394" target="_blank" rel="external">系统性能分析工具&amp;&amp;一些我对磁盘IOPS的简单认识</a></li>
</ul>
</li>
<li>★★★<strong>IO系统性能之一：衡量性能的几个指标</strong><ul>
<li>物理块是数据在磁盘上的存取单位，也就是每进行一次I/O操作，最小传输的数据大小</li>
<li>随机访问指的是本次IO所给出的扇区地址和上次IO给出扇区地址相差比较大，这样的话<br>磁头在两次IO操作之间需要作比较大的移动动作才能重新开始读/写数据。</li>
<li>IO Chunk Size </li>
<li><a href="http://www.dbabeta.com/2009/io-performence-01_several-concepts.html" target="_blank" rel="external">IO系统性能之一：衡量性能的几个指标</a></li>
<li><a href="http://zh.wikipedia.org/wiki/硬盘驱动器" target="_blank" rel="external">硬盘驱动器</a></li>
</ul>
</li>
<li>blktrace命令学习<ul>
<li>blktrace -d /dev/sda -o - | blkparse -i -  </li>
<li>btrace /dev/sda 与上同效</li>
<li>blktrace /dev/sda /dev/sdb,  blkparse sda sdb </li>
<li>更多参考 more blktrace</li>
<li><a href="http://blog.yufeng.info/archives/751#more-751" target="_blank" rel="external">blktrace 深度了解linux系统的IO运作</a></li>
<li><a href="http://bbs.chinaunix.net/thread-1976867-1-1.html" target="_blank" rel="external">Linux下block层的监控工具blktrace</a></li>
</ul>
</li>
<li>fio工具学习<ul>
<li>fio是个非常强大的IO性能测试工具，可以毫不夸张的说，如果你把所有的fio参数都搞明白了，<br>基本上就把IO协议栈的问题搞的差不多明白了，原因在于作者Jens Axboe是linux内核IO部分的maintainer. </li>
<li><a href="http://blog.yufeng.info/archives/tag/fio" target="_blank" rel="external">fio性能测试工具新添图形前端gfio</a></li>
<li><a href="http://blog.itpub.net/26855487/viewspace-754346/" target="_blank" rel="external">linux 使用FIO测试磁盘iops</a></li>
</ul>
</li>
<li>SystemTap(stap)工具学习<ul>
<li>安装<ul>
<li>yum install systemtap-devel systemtap-runtime kernel-devel </li>
<li>参考 <a href="https://sourceware.org/systemtap/wiki/SystemtapOnFedora" target="_blank" rel="external">Systemtap On Fedora</a></li>
</ul>
</li>
<li>测试 <code>stap -ve &#39;probe begin { log(&quot;hello world&quot;) exit() }&#39;</code></li>
<li>关于stap的中文文章, 在<a href="https://sourceware.org/systemtap/wiki" target="_blank" rel="external">https://sourceware.org/systemtap/wiki</a>页面上搜索”chinese”</li>
<li><a href="https://sourceware.org/systemtap/wiki" target="_blank" rel="external">SystemTap Homepage</a></li>
<li><a href="http://en.wikipedia.org/wiki/SystemTap" target="_blank" rel="external">wikipedia</a></li>
<li><a href="http://www.ibm.com/developerworks/cn/linux/l-systemtap/" target="_blank" rel="external">Linux 自检和 SystemTap</a></li>
<li><a href="https://sourceware.org/systemtap/examples/" target="_blank" rel="external">stap example</a></li>
</ul>
</li>
<li>LIO</li>
</ul>
<h4 id="2015-03-17"><a href="#2015-03-17" class="headerlink" title="2015-03-17"></a>2015-03-17</h4><ul>
<li>LIO 以下功能ok<ul>
<li>./ucli vd_iscsi -l</li>
<li>./ucli vd_iscsi -C -d dg2 -v lv1 -s 409600</li>
<li>./ucli vd_iscsi -D -d dg2 -v lv1</li>
<li>./ucli iscsi_chap –list</li>
<li>./ucli iscsi_chap –add -d dg2 -v lv1 -u user_name -p user_passwd</li>
<li>./ucli iscsi_chap –del -d dg2 -v lv1 -u user_name</li>
</ul>
</li>
<li>LIO 执行 <code>service target restart</code> 启动失败，dmesg发现如下信息:<br>[434707.208964] Rounding down aligned max_sectors from 4294967295 to 4294967288<br>[434707.209653] emulate_write_cache cannot be changed when underlying HW reports WriteCacheEnabled, ignoring request<br>[434707.213707] kernel_bind() failed: -98<br>通过<code>netstat -apn |grep 3260</code> 发现3260端口被ietd占用了, 把ietd进程kill掉就好了  </li>
<li>CentOS 7 版本<ul>
<li>3.10.0-123.el7.x86_64</li>
<li><a href="http://vault.centos.org/centos/7.0.1406/os/Source/SPackages/" target="_blank" rel="external">http://vault.centos.org/centos/7.0.1406/os/Source/SPackages/</a> </li>
<li>内核源码: <a href="http://vault.centos.org/centos/7.0.1406/os/Source/SPackages/kernel-3.10.0-123.el7.src.rpm" target="_blank" rel="external">http://vault.centos.org/centos/7.0.1406/os/Source/SPackages/kernel-3.10.0-123.el7.src.rpm</a></li>
<li>targetcli源码: <a href="http://vault.centos.org/centos/7.0.1406/os/Source/SPackages/targetcli-2.1.fb34-1.el7.src.rpm" target="_blank" rel="external">http://vault.centos.org/centos/7.0.1406/os/Source/SPackages/targetcli-2.1.fb34-1.el7.src.rpm</a></li>
</ul>
</li>
</ul>
<h4 id="2015-03-16"><a href="#2015-03-16" class="headerlink" title="2015-03-16"></a>2015-03-16</h4><ul>
<li><a href="http://blog.yufeng.info/archives/2328" target="_blank" rel="external">BufferedIO和DirectIO混用导致的脏页回写问题</a></li>
<li>git diff 发现出现大片文件修改，原来是file mode的问题:<ul>
<li><code>git config core.fileMode false</code></li>
<li><a href="http://www.cnblogs.com/flyme/archive/2011/10/27/2226729.html" target="_blank" rel="external">git file mode</a></li>
</ul>
</li>
<li><strong>分析IET 是如何实现Type(fileio,blockio), IOMode(wr,wt), Sector(512,4096)</strong></li>
</ul>
<h4 id="2015-03-13"><a href="#2015-03-13" class="headerlink" title="2015-03-13"></a>2015-03-13</h4><ul>
<li>判断当前平台的字节序：<br>int x = 1;<br>if (<em>(char </em>)&amp;x == 1)<br>  /<em> little endian </em>/<br>else<br>  /<em> big endian </em>/  </li>
<li><a href="http://lengxuezhixuan.blog.chinaunix.net/uid-22397896-id-3349474.html" target="_blank" rel="external">Linux内核学习——网络设备</a></li>
<li>VFS – File System – Block device</li>
<li><a href="http://lengxuezhixuan.blog.chinaunix.net/uid-22397896-id-3349451.html" target="_blank" rel="external">Linux内核学习——文件系统与块设备</a><ul>
<li>VFS只关心如下的结构体:<ul>
<li>superblock</li>
<li>inode</li>
<li>dentry</li>
<li>file</li>
</ul>
</li>
<li>块设备<ul>
<li>块设备是指可以随机读写访问，并且每次最小只能访问固定数量的数据。硬件的最<br>小单位是扇区sector（通常512字节或更大）</li>
<li>对于内核来说，块设备只是一块块sector的数据</li>
<li>request方法，request队列，reordering, bio</li>
</ul>
</li>
<li>页缓存 <ul>
<li>直接写磁盘，并标志页无效</li>
<li>不光写磁盘，而且写（更新）写，这个叫write-through</li>
<li>写页，不立即写磁盘，标记页为dirty（其实指的是磁盘上的数据为dirty），并将<br>dirty的页放入dirty页list，周期性的回写至磁盘（相关的flusher内核线程来做），<br>这个叫write-back </li>
<li>一个页（page）可以缓存多个磁盘上的block，因为一个page通常为4KB，磁盘上的<br>一个block可能只有512B。一个文件在页缓存上的描述用struct address_space来表示。</li>
</ul>
</li>
<li><a href="http://lengxuezhixuan.blog.chinaunix.net/uid-22397896-id-3349451.html" target="_blank" rel="external">Linux内核学习——文件系统与块设备</a></li>
</ul>
</li>
<li>Linux的文件I/O是如何工作<ul>
<li>open 系统调用, <code>open(&quot;test.file&quot;,O_WRONLY|O_APPDENT|O_SYNC))</code><ul>
<li>O_DSYNC告诉内核，当向文件写入数据的时候，只有当数据写到了磁盘时，写入操作<br>才算完成（write才返回成功）。和O_DSYNC同类的文件标志，还有O_SYNC,O_RSYNC，O_DIRECT。</li>
<li>O_SYNC比O_DSYNC更严格，不仅要求数据已经写到了磁盘，而且对应的数据文件的属<br>性（例如文件长度等）也需要更新完成才算write操作成功。可见O_SYNC较之O_DSYNC要多做一些操作。</li>
<li>O_RSYNC表示文件读取时，该文件的OS cache必须已经全部flush到磁盘了</li>
<li>如果使用O_DIRECT打开文件，则读/写操作都会跳过OS cache，直接在device（disk）<br>上读/写。因为没有了OS cache，所以会O_DIRECT降低文件的顺序读写的效率 </li>
</ul>
</li>
<li>write 系统调用, <code>write(fd,buf,6)</code></li>
<li>flush 系统调用, <code>fdatasync(fd)</code><ul>
<li>fsync和fdatasync的区别等同于O_SYNC和O_DSYNC的区别。</li>
<li>sync函数表示将文件在OS cache中的数据排入写队列，并不确认是否真的写磁盘了，所以sync并不可以靠。</li>
</ul>
</li>
<li>忽略文件打开的过程，通常我们会说“写文件”有两个阶段，<ul>
<li>调用write我们称为写数据阶段（其实是受open的参数影响），</li>
<li>调用fsync（或者fdatasync）我们称为flush阶段。</li>
</ul>
</li>
<li><a href="http://www.orczhou.com/index.php/2009/08/innodb_flush_method-file-io/" target="_blank" rel="external">innodb_flush_method 与 File I/O</a></li>
<li><a href="http://man7.org/linux/man-pages/man2/open.2.html" target="_blank" rel="external">http://man7.org/linux/man-pages/man2/open.2.html</a></li>
</ul>
</li>
<li><code>man 2 open</code>,<code>man 2 write</code>,<code>man 2 fork</code> 查看系统调用函数<ul>
<li><a href="http://www.ibm.com/developerworks/cn/linux/kernel/syscall/part1/index.html" target="_blank" rel="external">系统调用跟我学(1)</a></li>
</ul>
</li>
</ul>
<h4 id="2015-03-12"><a href="#2015-03-12" class="headerlink" title="2015-03-12"></a>2015-03-12</h4><ul>
<li>关于<strong>VFS层是如何实现write-back的</strong><ul>
<li>VFS 缓冲: page cache, buffer cache, inode cache, dictory cache</li>
<li>fs/open.c, fs/namei.c</li>
<li>sys_open() -&gt;do_sys_open() -&gt;do_filp_open() -&gt;do_last() -&gt;nameidata_to_filp() -&gt;_dentry_open()</li>
<li>fs/read_write.c, mm/filemap.c</li>
<li>sys_read() -&gt;vfs_read() -&gt;do_sync_read() -&gt;generic_file_aio_read() -&gt;do_generic_file_aio_read()</li>
<li>sys_write() -&gt;vfs_write() -&gt;do_sync_write() -&gt;generic_file_aio_write() -&gt; </li>
<li>fs/buffer.c, fs/fs-writeback.c</li>
<li>fs/sync.c, mm/filemap.c</li>
<li>do_fsync() -&gt;vfs_sync() -&gt;vsf_fsync_range() -&gt;filemap_write_and_wait_range()</li>
<li>sync() -&gt;vfs_sync() -&gt;vsf_fsync_range() -&gt;filemap_write_and_wait_range()</li>
<li>《存储技术原理分析 – 第8章 文件系统》</li>
<li><a href="http://www.woqutech.com/?p=1459" target="_blank" rel="external">细看INNODB数据落盘</a></li>
<li><a href="https://www.usenix.org/legacy/event/usenix01/full_papers/kroeger/kroeger_html/node8.html" target="_blank" rel="external">The Linux kernel’s VFS Layer</a></li>
</ul>
</li>
<li><a href="http://www.penglixun.com/study/science/mit_math_system.html/comment-page-1#comment-669262" target="_blank" rel="external">MIT牛人解说数学体系</a></li>
<li><a href="http://www.penglixun.com/tech/system/buffer_and_cache_diff.html" target="_blank" rel="external">Buffer与Cache区别</a><ul>
<li>首先从翻译上，Buffer应该翻译为“缓冲”，Cache应该翻译为“缓存” </li>
<li>在硬件这一层看,Buffer应该为内存，Cache为CPU集成的高速缓存 </li>
<li>从软件这一层来说，Buffer是块设备的缓冲，Cache是文件系统的缓存<ul>
<li>Buffer(Buffer Cache)以块形式缓冲了块设备的操作，定时或手动的同步到硬盘，<br>它是为了缓冲写操作然后一次性将很多改动写入硬盘，避免频繁写硬盘，提高写入效率。</li>
<li>Cache(Page Cache)以页面形式缓存了文件系统的文件，给需要使用的程序读取，<br>它是为了给读操作提供缓冲，避免频繁读硬盘，提高读取效率。</li>
</ul>
</li>
<li>总而言之，Buffer里面的东西是为了写到别处去，Cache里面的东西是为了给别处读</li>
</ul>
</li>
<li>出现一个问题不解决，下次碰到这个问题也还是解决不了，还要从头开始解一遍，费时费力。<br>不如一次性下够功夫去解，尽量解决掉，虽然花了比较多时间，但是下次碰到问题就节约时间和精力了。</li>
<li>继续分析昨天的问题: ping 172.16.60.151 没有响应<ul>
<li>发现从151的网口eth1都无法ping通网关172.16.60.1</li>
<li>还是搞不定 2015/03/12 15:26</li>
</ul>
</li>
</ul>
<h4 id="2015-03-11"><a href="#2015-03-11" class="headerlink" title="2015-03-11"></a>2015-03-11</h4><ul>
<li>又出现另外一台机器ping没有响应, 172.16.60.151<ul>
<li>[root@localhost ~]# ip addr<br>1: lo: <loopback,up,lower_up> mtu 16436 qdisc noqueue state UNKNOWN   <pre><code>link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00  
inet 127.0.0.1/8 scope host lo  
inet6 ::1/128 scope host   
   valid_lft forever preferred_lft forever  
</code></pre>2: eth0: <broadcast,multicast,up,lower_up> mtu 1500 qdisc mq state UP qlen 1000  <pre><code>link/ether 00:1e:67:c9:9a:f4 brd ff:ff:ff:ff:ff:ff  
inet 172.16.60.150/24 brd 172.16.60.255 scope global eth0  
inet6 fe80::21e:67ff:fec9:9af4/64 scope link   
   valid_lft forever preferred_lft forever  
</code></pre>3: eth1: <broadcast,multicast,up,lower_up> mtu 1500 qdisc mq state UP qlen 1000  <pre><code>link/ether 00:1e:67:c9:9a:f5 brd ff:ff:ff:ff:ff:ff  
inet 172.16.60.151/24 brd 172.16.60.255 scope global eth1  
inet6 fe80::21e:67ff:fec9:9af5/64 scope link   
   valid_lft forever preferred_lft forever  
</code></pre>[root@localhost ~]# route<br>Kernel IP routing table<br>Destination     Gateway         Genmask         Flags Metric Ref    Use Iface<br>172.16.60.0     <em>               255.255.255.0   U     0      0        0 eth0<br>172.16.60.0     </em>               255.255.255.0   U     0      0        0 eth1<br>link-local      <em>               255.255.0.0     U     1002   0        0 eth0<br>link-local      </em>               255.255.0.0     U     1003   0        0 eth1<br>default         172.16.60.1     0.0.0.0         UG    0      0        0 eth0  </broadcast,multicast,up,lower_up></broadcast,multicast,up,lower_up></loopback,up,lower_up></li>
<li>在想一个问题， 使用<code>tcpdump -n -e -i eth0 icmp</code>是可以看到收到”ICMP echo request”, 但是<br>没有发送ICMP echo reply, 应该是route设置问题,导致响应的数据包不知道怎么发送给<br>运行ping程序的机器(172.16.50.39). 注意这里执行route得到eth0的default网关，<br>现在是ping 172.16.60.151, 这个是eth1的IP，内核怎么根据路由规则操作呢?</li>
</ul>
</li>
<li>172.16.60.121机器不能组IP访问, 学习ping,ICMP协议以及工作原理<ul>
<li>[root@localhost ~]# ip addr<br>2: eth0: <broadcast,multicast,up,lower_up> mtu 1500 qdisc mq state UP qlen 1000  <pre><code>link/ether 00:07:ec:01:00:79 brd ff:ff:ff:ff:ff:ff  
inet 172.16.60.121/24 scope global eth0  
inet 172.16.60.120/24 scope global secondary eth0  
</code></pre>3: eth1: <broadcast,multicast,up,lower_up> mtu 1500 qdisc mq state UP qlen 1000  <pre><code>link/ether 00:07:ec:01:00:7a brd ff:ff:ff:ff:ff:ff  
inet 172.16.60.122/24 scope global eth1  
inet 172.16.60.120/24 scope global secondary eth1  
</code></pre>4: eth2: <broadcast,multicast,up,lower_up> mtu 1500 qdisc mq state UP qlen 1000  <pre><code>link/ether 00:07:ec:01:00:7b brd ff:ff:ff:ff:ff:ff  
inet 172.16.60.123/24 scope global eth2  
inet 172.16.60.120/24 scope global secondary eth2  
</code></pre>5: eth3: <broadcast,multicast,up,lower_up> mtu 1500 qdisc mq state UP qlen 1000  <pre><code>link/ether 00:07:ec:01:00:7c brd ff:ff:ff:ff:ff:ff  
inet 172.16.60.124/24 scope global eth3  
inet 172.16.60.120/24 scope global secondary eth3  
</code></pre></broadcast,multicast,up,lower_up></broadcast,multicast,up,lower_up></broadcast,multicast,up,lower_up></broadcast,multicast,up,lower_up></li>
<li>从172.16.50.39 ping 60.121没有问题, ping 60.120 没有回应.</li>
<li>检查系统配置 sysctl -a |grep net, 和常用的存储机器比较，没有发现异常。</li>
<li><a href="http://buguoruci.blog.51cto.com/4104173/1255836" target="_blank" rel="external">linux系统内核参数说明</a></li>
<li>linux-2.6.32-279.el6/include/linux/icmp.h<ul>
<li>define ICMP_ECHOREPLY 0  回显回答</li>
<li>define ICMP_ECHO 8  回显请求</li>
<li>struct icmphdr, icmp报文结构.</li>
</ul>
</li>
<li>linux-2.6.32-279.el6/net/ipv4/icmp.c 中编码了如何操作ICMP<ul>
<li>icmp_rcv函数处理进来的icmp报文, 调用函数处理icmp_pointers[icmph-&gt;type].handler(skb) </li>
<li>icmp_pointers是个函数指针结构体，根据不用的ICMP代号执行不用的处理函数<br>ICMP_ECHOREPLY, 调用icmp_discard, 这是个空函数，不做实际操作<br>ICMP_ECHO, 调用icmp_echo,  处理回显请求的函数</li>
<li>icmp_echo, 首先判断是否忽略全部icmp请求，如果不是就填充ICMP结构，调用icmp_reply(&amp;icmp_param, skb); </li>
</ul>
</li>
<li>目前看到大概的网络流程是这样的：<ul>
<li>ip_input.c: ip_local_deliver函数 =&gt; ip_local_deliver_finish函数 =&gt; ipprot-&gt;handler()</li>
<li>af_inet.c中定义了struct net_protocol类型的icmp_protocol，其中handler指针指向icmp_rcv</li>
<li>af_inet.c中的inet_init函数 =&gt; inet_add_protocol(&amp;icmp_protocol, IPPROTO_ICMP)</li>
<li>protocol.c中的inet_add_protocol函数把icmp_protocol加入数组inet_protos</li>
<li>上面ip_input.c中的ipprot指针指向inet_protos数组</li>
<li>另外只看到ipmr.c中的ip_mr_input函数调用ip_local_deliver, 而ip_mr_input函数只在<br>route.c中被调用.</li>
</ul>
</li>
<li>ping 来自声呐脉冲(soar ping), 参考《TCP/IP详解 卷2:实现》 page: 252</li>
<li>总结一下:<ul>
<li>A机器:ping是用户态程序，自己构建ICMP协议封包，然后通过内核网络把数据发送给B机器.</li>
<li>B机器:内核网络接收到数据，检查是ICMP协议，就转由net/ipv4/icmp.c的icmp_rcv函数处理  <pre><code>该函数直接构建ICMP响应数据包，直接发往A机器
</code></pre></li>
<li>所以整个ping过程是用户态跟内核态的通讯过程，其中发送请求是由用户态完成，响应是由核态完成</li>
<li>内核态只处理icmp请求，不处理”icmp回应数据包”, 所以在ping所在的机器的内核不处理ECHOREPLY封包</li>
</ul>
</li>
</ul>
</li>
<li>LIO <ul>
<li>昨天看2015-01-23的日记，说LIO块模式不支持write-back, 其实准确来说是这样的：  <ul>
<li>当时有看CentOS 7的targetcli代码，这里的版本是支持write-back的. 直接运行<br>命令<code>targetcli</code>可以看到”targetcli shell version 2.1.fb34”</li>
<li>也有看我主机(Fedora21)的代码, 这里的版本是不支持write-back的. 运行<code>targetcli --version</code><br>可以看到”/usr/bin/targetcli version 2.1.fb39”</li>
<li>所以是比较新的版本把write-back的支持去掉了.</li>
<li>那为什么要去掉呢?难道块设备不需要write-back?不支持缓存写吗?</li>
</ul>
</li>
<li>★★★问题延伸: <strong>VFS层是如何实现write-back的, block块设备又如何才能做到write-back?</strong> </li>
</ul>
</li>
</ul>
<h4 id="2015-03-10"><a href="#2015-03-10" class="headerlink" title="2015-03-10"></a>2015-03-10</h4><ul>
<li>解一存储机器eth1消失问题，<ul>
<li>现象: ifconfig和ip addr都没有eth1信息, 且网络接口灯不亮。</li>
<li>查看dmesg，发现”[    5.508843] udev: renamed network interface eth1 to rename3”<br>但是在这行之前是可以发现eth1的。检查一下udev的配置！<br>[root@localhost ~]# cat /etc/udev/rules.d/70-persistent-net.rules<br>SUBSYSTEM==”net”, ACTION==”add”, DRIVERS==”?<em>“, ATTR{address}==”00:07:ec:01:00:7c”,<br>ATTR{type}==”1”, KERNEL==”eth</em>“, NAME=”eth2”<br>[root@localhost ~]# dmesg |grep eth1<br>[    5.441580] igb 0000:04:00.0: eth1: (PCIe:2.5GT/s:Width x1)<br>[    5.441581] igb 0000:04:00.0: eth1: MAC: 00:07:ec:01:00:7a<br>[    5.441597] igb 0000:04:00.0: eth1: PBA No: Unknown<br>[    5.508843] udev: renamed network interface eth1 to rename3  </li>
<li><a href="http://unix.stackexchange.com/questions/91085/udev-renaming-my-network-interface" target="_blank" rel="external">http://unix.stackexchange.com/questions/91085/udev-renaming-my-network-interface</a></li>
<li>检查udev规则，ifcfg-ethXX的配置，和系统启动时得到的MAC信息<br>[root@localhost ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0 |grep HWADDR<br>HWADDR=00:07:EC:01:00:79<br>[root@localhost ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth1 |grep HWADDR<br>HWADDR=0c:c4:7a:0b:a3:95<br>[root@localhost ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth2 |grep HWADDR<br>HWADDR=00:07:ec:01:00:7b<br>[root@localhost ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth3 |grep HWADDR<br>HWADDR=00:07:ec:01:00:7c<br>[root@localhost ~]# dmesg |grep MAC<br>[    5.409752] igb 0000:03:00.0: eth0: MAC: 00:07:ec:01:00:79<br>[    5.441581] igb 0000:04:00.0: eth1: MAC: 00:07:ec:01:00:7a<br>[    5.473946] igb 0000:05:00.0: eth2: MAC: 00:07:ec:01:00:7b<br>[    5.504549] igb 0000:06:00.0: eth3: MAC: 00:07:ec:01:00:7c<br>可以看到ifcfg-eth1的配置的MAC不对，修改了应该OK.</li>
</ul>
</li>
<li>处理MSM ip地址显示问题:<ul>
<li>regedit, 查找192.168.23.107, 找到修改即可。<ul>
<li>路径: HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\JavaSoft\Prefs\com\/L/S/I\/Vivaldi\71244</li>
<li>名字: PERSISTENT_REM_FW_IP</li>
<li>reg query HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\JavaSoft\Prefs\com\/L/S/I\/Vivaldi\71244 /s</li>
<li>reg query HKEY_LOCAL<em>MACHINE\SOFTWARE\Wow6432Node\JavaSoft\Prefs\com\/L/S/I\/Vivaldi\71244 /v<br>/P/E/R/S/I/S/T/E/N/T</em>/R/E/M<em>/F/W</em>/I/P</li>
<li>reg add HKEY_LOCAL<em>MACHINE\SOFTWARE\Wow6432Node\JavaSoft\Prefs\com\/L/S/I\/Vivaldi\71244 /v<br>/P/E/R/S/I/S/T/E/N/T</em>/R/E/M<em>/F/W</em>/I/P /t REG_SZ /d “” /f</li>
</ul>
</li>
<li>如果使用都在本机器操作，修改为127.0.0.1即可.</li>
<li>如果清空值(Data), 就可以获取正确的本地IP</li>
<li>为什么有些机器在注册表记录了这个IP，可是MSM还是能够获取更新后的IP地址呢？</li>
</ul>
</li>
</ul>
<h4 id="2015-03-09"><a href="#2015-03-09" class="headerlink" title="2015-03-09"></a>2015-03-09</h4><ul>
<li>处理MSM ip地址显示问题:<ul>
<li>客户现场又反馈出现有问题的机器了，请客户帮忙提供远程环境(teamviewer)</li>
<li>经验证测试，证实问题存在, MSM显示的IP是192.168.23.107</li>
<li>共4个网络接口, 其中192.168.0.151为开启，其他3个禁用且没有连接网线，</li>
<li>开启3个禁用的网络，设置静态IP 172.16.110.5/6/7, 并且连接网线</li>
<li>MSM显示依然是192.168.23.107</li>
<li>会不会MSM软件在哪里记录这个IP地址，在安装目录下搜索内容”192.168.23.107”，找不到匹配文件…<br>可能IP地址保存的格式不是文本形式，这样就无法搜索了.</li>
<li>现场的MSM版本8.17.200</li>
<li>公司这边的服务器上有11.08.02.07版本，尝试拷贝过去看看，是不是软件有问题，新版验证OK<br>可以正确获取机器IP，即随机器改变.</li>
<li>那到底是什么问题？版本问题？那为什么只有一些机器出现问题？</li>
<li>拷贝现场有问题的软件到本地运行，没有发现问题, 搜索”192.168.23.107”字符串，只在<br>./Framework/aaskfdjvuosd.dhdkhsc中找到，貌似也没有问题.</li>
</ul>
</li>
<li>MegaRAID Storage Manager(MSM) windows 软件下载地址 <a href="http://www.lsi.com/products/raid-controllers/pages/megaraid-sas-9260-8i.aspx#tab/tab4" target="_blank" rel="external">这里</a><ul>
<li><a href="http://www.lsi.com/downloads/Public/RAID%20Controllers/RAID%20Controllers%20Common%20Files/14.11.01.00_Windows_MSM.zip" target="_blank" rel="external">最新版本 14.11.01.00</a></li>
</ul>
</li>
<li>使用 netsh 命令关闭 IPv6 隧道适配器<ul>
<li>netsh interface teredo set state disable</li>
<li>netsh interface 6to4 set state disabled</li>
<li>netsh interface isatap set state disabled </li>
<li><a href="http://marui.blog.51cto.com/1034148/380357" target="_blank" rel="external">关闭 Windows 7中的 6to4 隧道</a></li>
</ul>
</li>
<li>IET设置IOMode和Sector<ul>
<li>ietadm –op new –tid=%d –lun=%d –params Path=/dev/%s/%s,IOMode=%s,Sector=%s,Type=%s <ul>
<li>IOMode: wb or wt or ro</li>
<li>Sector: 512 or 4096</li>
<li>Type: fileio or blockio</li>
</ul>
</li>
<li>ietadm.c: main() -&gt; lunit_handle() -&gt; ietd_request() -&gt; ietd_connect(),ietd_request_send(),ietd_response_recv()<ul>
<li>ietd_connect() -&gt; socket(AF_LOCAL, SOCK_STREAM, 0), connect() </li>
<li>ietd_request_send() -&gt; write(fd, req, sizeof(*req))</li>
<li>ietd_request_recv() -&gt; readv(), read() </li>
</ul>
</li>
<li>ietd.c: main() -&gt; message.c: ietadm_request_listen() -&gt; <ul>
<li>ietadm_request_listen() -&gt; socket(AF_LOCAL, SOCK_STREAM, 0), bind(), listen()</li>
</ul>
</li>
</ul>
</li>
</ul>
<h4 id="2015-03-06"><a href="#2015-03-06" class="headerlink" title="2015-03-06"></a>2015-03-06</h4><ul>
<li>查看IET代码iscsitarget-1.4.20<ul>
<li>grep -rin iomode ./</li>
<li>opt_ignore, “iomode=%s”</li>
<li>opt_ignore都会break，即忽略设置</li>
<li>ietadm –op new –tid= –lun= –params<ul>
<li>调用 ietadm.c:lunit_handle函数 -&gt;ietd_request函数 -&gt;ietd_request_send函数</li>
<li>ietd.c的event_loop函数监听到有消息，执行message.c:ietadm_request_handle函数 </li>
<li>message.c:ietadm_request_handle函数 -&gt; ietadm_request_exec函数<br>类型为C_LUNIT_NEW, 执行cops-&gt;lunit_add  </li>
<li>plain.c:plain_lunit_create -&gt;__plain_lunit_create -&gt; ki-&gt;lunit_create </li>
<li>ctldev.c:iscsi_lunit_create -&gt; ioctl(ctrl_fd, ADD_VOLUME, &amp;info) </li>
<li>config.c:add_volume -&gt; volume.c:volume_add -&gt; volume.c:parse_volume_params </li>
<li>volume.c:parse_volume_params 函数检查发现是opt_iomode类型，<br>如果是ro类型执行SetLUReadonly(volume);<br>如果是wb类型执行SetLUWCache(volume);<br>如果是wt类型则类型不可用  </li>
<li>SetLUReadonly和SetLUWCache都在iscsi.h中定义，都只是修改struct iet_volume结构体中的flags的值。</li>
<li>另外块大小blocksize保存在结构体struct iet_volume的blk_shift中,且块大小必须是<br>2的幂次方，大于等于512，小于4096. 注意保存的是2的幂的次数，即如果是1024，则blk_shift是10</li>
<li>如果fileio,进入file-io.c:fileio_attach函数, 调用parse_fileio_params, 这里会忽略好些参数的值.<br>之用path参数会有处理。  </li>
<li>如果blockio,进入block-io.c:blockio_attach函数, 调用parse_blockio_params, 这里会忽略好些参数的值.<br>之用path参数会有处理。  </li>
<li>file-io.c 和 block-io.c要好好看看，这个逻辑卷到底怎么创建的.</li>
</ul>
</li>
</ul>
</li>
<li>LIO要解的几个问题:<ul>
<li>怎么设置IO模式,直写或缓冲写, wb or wt (write-back or write-through)</li>
<li>怎么设置sector大小? IET可以设置为4096</li>
<li>IET又是怎么做的呢？</li>
</ul>
</li>
<li>存储服务器有两个网口绿灯不亮，且该问题网口速度千兆变百兆<ul>
<li>橙色灯表示有数据传送，绿色灯表示网络连通</li>
<li>ethtool eth2 查询确认可以支持千兆, 但是当前速度却是百兆</li>
<li>ethtool -s eth2 speed 1000 修改无变化</li>
<li>把千兆网口的网线换到百兆的网口，现象调换了！后面询问得知实验室有两个交换机，<br>一个是百兆一个是千兆，把连接百兆交换机的网线接到机器上，绿灯就灭，速度变百兆…</li>
<li>当接上百兆网线时<ul>
<li>dmesg信息: igb: eth3 NIC Link is Up 100 Mbps Full Duplex, Flow Control: None </li>
<li>ethtool eth3 得到 MDI-X: on</li>
</ul>
</li>
<li>当接上千兆网线时<ul>
<li>dmesg信息: igb: eth3 NIC Link is Up 1000 Mbps Full Duplex, Flow Control: RX/TX</li>
<li>ethtool eth3 得到 MDI-X: off</li>
</ul>
</li>
<li><a href="http://www.anxue.net/jisuanji/Linux/2013/1021/216006.html" target="_blank" rel="external">http://www.anxue.net/jisuanji/Linux/2013/1021/216006.html</a></li>
</ul>
</li>
<li>通过邮件发送日志信息<ul>
<li>产生要邮件发送的日志时，写入指定文件，如/tmp/mail.log</li>
<li>开一个线程，一个loop，不停的读取日志文件内容，</li>
<li>执行命令<code>cat 日志信息|mutt -s Err/Warn/Info 邮件地址</code></li>
<li>函数调用<code>truncate(日志文件, 0)</code>，清理日志信息</li>
</ul>
</li>
<li>ietd进程是怎么启动的？  <ul>
<li>查询进程ietd的父进程<br>[root@localhost ~]# ps axjf<br> PPID   PID  PGID   SID TTY  TPGID STAT   UID   TIME COMMAND  <pre><code>0     1     1     1 ?       -1 Ss       0   0:00 /sbin/init  
1  2717  2717  2717 ?       -1 Ss       0   0:00 /usr/sbin/ietd  
</code></pre>可以看到ietd的父进程是/sbin/init, 即由系统init启动的。  </li>
<li>搜索可能的启动命令<br>grep -rl ietd /etc/  </li>
<li>可疑文件/etc/rc3.d/S88ustor <ul>
<li>grep -rn ietd /etc/rc3.d/S88ustor 这个得不到有用信息</li>
<li>grep -rn iscsi /etc/rc3.d/S88ustor, 有行代码 ucli iscsi_service –apply </li>
</ul>
</li>
<li>查看ucli代码sys_mngt.c, –apply执行函数iscsi_service_apply,该函数执行:  <ul>
<li>system (“/etc/init.d/iscsi-target stop &gt;&amp; /dev/null”);</li>
<li>system (“/etc/init.d/iscsi-target start”);</li>
</ul>
</li>
<li>总结:<ul>
<li>系统启动, 允许级别level 3</li>
<li>执行/etc/rc3.d/下的脚本S88ustor</li>
<li>执行ucli iscsi_service –apply</li>
<li>/etc/init.d/iscsi-target start</li>
</ul>
</li>
</ul>
</li>
</ul>
<h4 id="2015-03-05"><a href="#2015-03-05" class="headerlink" title="2015-03-05"></a>2015-03-05</h4><ul>
<li><code>tar -xvf 1425279081.tar.gz var/log/message</code>只解压一个文件</li>
<li>处理MSM ip地址显示问题:<ul>
<li>跟客户那边沟通过了;<br>环境是这样：存储机器直接连接交换机操作。<br>问题是这样：客户直接修改主机的IP地址，但是MSM软件打开后显示的iP地址没有随主机IP变换。<br>现在客户那边有问题的机器已出货，没有办法查看！<br>客户反馈北海这边有重现问题，但跟北海电话确认，北海这边MSM软件显示的IP是会随主机IP变化的。  </li>
<li>MSM软件显示IP地址的方式应该跟命令ipconfig是一致的，所以如果修改了主机IP，且使用<br>ipconfig命令确认生效,这时重新打开MSM软件应该得到的新的IP地址。<br>下次碰到这个问题，可以使用ipconfig查询下。</li>
<li>这边有在172.16.110.121跑MSM软件，显示的IP是192.168.56.1。但是使用ipconfig查看发现56.1<br>这是Ethernet adapter VirtualBox Host-Only Network的IP。这说明MSM软件取的ip跟ipconfig<br>获取的顺序不一样。但是至少显示的ip在ipconfig中有发现找到。而如果北海那边设置了IP，但<br>在客户这边修改的不是北海的IP，且恰好MSM取的是北海设置的IP，就可能出现客户这边怪异的现象。  </li>
<li>另外修改了IP，要记得重新启动MSM软件。</li>
<li>如果设置的是静态IP，机器没有接网线，MSM得到的还是原来设置的静态IP</li>
<li>如果设置的是DHCP动态IP，机器没有接网线，MSM得到的是127.0.0.1</li>
<li>客户那边就怀疑，他们设置的IP不是北海使用的IP。总共有四个网口，客户有在网络中心去屏蔽不用的IP。</li>
</ul>
</li>
<li>分析ietd进程退出问题，拿到诊断日志分析:<ul>
<li>查看diagnosis/sys/dmesg文件, 发现如下信息:<br>proc_mkdir net/iet<br>iscsi_trgt: Registered io type fileio<br>iscsi_trgt: Registered io type blockio<br>iscsi_trgt: Registered io type nullio<br>iscsi_trgt: open_path(140) Can’t open /dev/001/v1 -2<br>iscsi_trgt: fileio_attach(240) -2  </li>
<li>上面的警告信息格式如下:<ul>
<li>iscsi_trgt是iscsi_dbg.h定义的打印信息头，</li>
<li>open_path是函数名，</li>
<li>140表示行号，  </li>
<li>接着是警告信息，最后是错误代码</li>
</ul>
</li>
<li>大概的调用过程如下<ul>
<li>usr/ietd.c: main, ietd启动，执行代码cops-&gt;init(config, &amp;isns, &amp;isns_ac)，实际是调用plain_init </li>
<li>usr/plain.c: plain_init, 调用plain_target_init, 调用<strong>plain_target_create, </strong>plain_lunit_create <pre><code>__plain_lunit_create调用内核接口的lunit_create, 实际是函数iscsi_lunit_create 
</code></pre></li>
<li>usr/ctldev.c: iscsi_lunit_create, 执行内核函数调用 ioctl(ctrl_fd, ADD_VOLUME, &amp;info)，进入内核</li>
<li>kenerl/config.c: ioctl, 调用 add_volume, add_volume 执行 volume_add </li>
<li>kenerl/volume.c: volume_add, 调用 attach, 该卷类型为fileio的话，就跑到file-io.c</li>
<li>kenerl/file-io.c: fileio_attach, 调用parse_fileio_params, parse_fileio_params又调用open_path, <pre><code>open_path判断路径指针有问题(IS_ERR)，执行eprintk(&quot;Can&apos;t open %s %d\n&quot;, path, err) 
</code></pre></li>
</ul>
</li>
<li>IS_ERR宏的理解, 参考<a href="http://blog.csdn.net/ce123_zhouwei/article/details/8450618" target="_blank" rel="external">linux内核中的IS_ERR</a><ul>
<li>IS_ERR用来判断指针是否到达内核空间的最后一个page</li>
</ul>
</li>
<li>上面解析了为什么出现这些警告，但是查看了代码，打开不了这些设备也不会造成进程退出，所以还需要分析。</li>
<li>还有如下信息:<br>md: md0 stopped.<br>md: bind<sdb><br>md: bind<sdc>  <ul>
<li>md模块属于linux内核代码的路径 linux-x.y.z/drivers/md</li>
<li>搜索位置<br>[root@localhost md]# pwd<br>/home/dennis/work/kernel/linux-2.6.32-279.el6/drivers/md<br>[root@localhost md]# grep -rn “md: bind” ./<br>./md.c:2056: printk(KERN_INFO “md: bind&lt;%s&gt;\n”, b);<br>[root@localhost md]# grep -rn “md: .* stop” ./<br>./md.c:5162: printk(KERN_INFO “md: %s stopped.\n”, mdname(mddev));  </li>
<li>md0 stopped的原因，可能是内核接收到STOP_ARRAY这样的ioctl命令. 也有可能是其他原因，<br>但是对这个md.c代码不熟悉，先不分析了.</li>
</ul>
</sdc></sdb></li>
<li>后面又输出了一行”iSCSI Target - version 1.2.1”, 说明IETD是有重新运行，可是怎么确定<br>前面有异常退出ietd进程呢? 可以看到出现这行版本信息前有一行：<br>“iscsi_trgt: Removing all connections, sessions and targets”<br>../kernel/target.c:318: iprintk(“Removing all connections, sessions and targets\n”);<br>config.c: release函数 会调用 target.c: target_del_all函数<br>但是找不到哪里调用config.c: release函数, 奇怪！  </li>
<li>查看日志文件 diagnosis/sys/log/ucli.log<ul>
<li>系统运行始于[2011/04/06-16:56:13]，最后的日志日期是[2015/03/04-15:25:09] </li>
<li>搜索全部关于iscsi的信息，发现只有2011/08/04创建了dg=001,vd=v1到v14的逻辑卷<br>还有[2015/03/02-17:13:40]的set iscsi disable和set iscsi enable</li>
<li>注意到当前的日志包名:diagnosis-1425453916.tar.gz, 解析时间戳出来的是<br>date -d @1425453916 输出 Wed Mar 4 15:25:16 CST 2015, 即昨天下午抓的日志。<br>那么上面出现输出两次ietd版本信息的原因是有人在3月2日周一的下午五点手动禁止和启用了iscsi服务. </li>
</ul>
</li>
<li>查看了下2015/03/03的邮件内容“现在发现2个问题，一台是ISCSI服务昨天下午发现自行退出；另外一台是磁盘组找不到了。”<ul>
<li>昨天下午，那就是2015/03/02的时间</li>
</ul>
</li>
</ul>
</li>
<li>邮件回复MSM软件Host IP地址问题,这边没有存储可以验证，但是提交了可能的解决方法！</li>
</ul>
<h4 id="2015-03-04"><a href="#2015-03-04" class="headerlink" title="2015-03-04"></a>2015-03-04</h4><ul>
<li>客户反馈IETD进程退出，这个会影响存储服务器iscsi卷的使用的。但是通常什么情况下会<br>造成ietd进程退出呢? 系统异常? 是程序自己退出的还是被系统杀掉的? 也许只有在查看<br>到相关的系统日志才能回答！</li>
<li>验证MSM软件Host IP修改，重新启动后又要重新输入问题.</li>
<li>David的阿里EMC机器上无法运行ActiveMQ,因为需要root权限.</li>
<li>神威上编译net-snmp<ul>
<li>/root/rpmbuild/SOURCES/net-snmp-5.7.2 </li>
</ul>
</li>
<li>for index in <code>seq 1 10</code>;do ucli vd_iscsi -C -d r5w -v vd_test${index} -s 102400 ; done <ul>
<li>会出现”fail(invalid parameter)”, 不能使用vd_test, 修改为vdtest就OK</li>
</ul>
</li>
</ul>
<h4 id="2015-03-03"><a href="#2015-03-03" class="headerlink" title="2015-03-03"></a>2015-03-03</h4><ul>
<li>神威webgui的“设置”–“网络设置”和“设置属性”显示的网络接口不匹配，如“网络设置”中<br>设置的只有一个eth1的IP，但是“设置属性”中显示的是“IP地址[接口0]”，应该显示“IP地址[接口1]”.<ul>
<li>设置页面属于源代码/opt/html/option/option_pro.php, 调用getNicInfo获取网络信息，<br>其实就是调用ucli network –conf获取IP信息</li>
<li>但是显示接口信息是和代码”._OPTIONS_NETWORK_INTERFACE.$i.”有关，注意这里使用的是序号变量i,<br>也就是说，只要是只设置一个非eth0的网口，到时都会显示“IP地址[接口0]”, 这应该是一直都有的问题.<br>除非，不要把“接口0”和”eth0”这两个名词对应起来就没有问题.</li>
</ul>
</li>
<li>LIO<ul>
<li>[root@localhost ucli]# ./ucli vd_iscsi -l<br>lvm.c, 788, get_all_lv, 65544<br>dg_name vd_name vd_size type  create_date         sector target_name<br>dg2     lv2      10240M iscsi 1970/01/01-08:00:00        iqn.2007-10.lio.com:dg2.lv2<br>dg2     lv3      20480M iscsi 2015/02/17-09:55:51 512    iqn.2007-10.lio.com:dg2.lv3<br>dg2     lv1      20480M iscsi 2015/02/17-09:56:11 512    iqn.2007-10.lio.com:dg2.lv1<br>dg2     iscsi   100000M iscsi 2015/02/17-18:33:39        iqn.2007-10.lio.com:dg2.iscsi  </li>
<li>Windows服务器(110.121)使用IOMeter测试， 一个卷，1M 0%read 0%random， 速度70MB/s左右</li>
<li>已完成的命令如下:(创建/删除dg，创建/删除auth, 罗列iscsi或auth)<ul>
<li>./lio -A -o iscsi -d dg2 -v lv1 </li>
<li>./lio -D -o iscsi -d dg2 -v lv1 </li>
<li>./lio -A -o auth -d dg2 -v lv1 -u dennis -p 123456</li>
<li>./lio -D -o auth -d dg2 -v lv1 -u dennis -p 123456</li>
<li>./lio -L -o auth -d dg2 -v lv1</li>
</ul>
</li>
</ul>
</li>
<li><a href="http://www.cnblogs.com/i6first/p/3549548.html" target="_blank" rel="external">解读SQL 内存数据库的细节</a><ul>
<li>内存数据库是把整个数据库放到内存中的吗？<ul>
<li>不是!</li>
<li>内存数据库其实就是将指定的表放到内存中，而不是整个数据库；</li>
<li>内存数据库用文件流的方式组织磁盘中的数据文件；</li>
<li>内存数据库的数据文件分data file和delta file，而且是成对出现； </li>
</ul>
</li>
<li>数据都在内存里面，那宕机或者断电了，数据不是没有了吗？<ul>
<li>不是!内存数据库通过两种方式保证数据的持久性：事务日志和chcekpoint。  </li>
</ul>
</li>
<li>数据在内存是怎么存放的，还是按照页的方式吗，一行的大小有限制吗？<ul>
<li>不是按照页的方式，一行的限制大小为8060Bytes </li>
</ul>
</li>
<li>内存数据库号称无锁式设计，SQL是如何处理并发冲突的呢？ <ul>
<li>内存数据库用行版本来处理冲突</li>
</ul>
</li>
</ul>
</li>
<li><a href="http://jingyan.baidu.com/article/3d69c551610590f0ce02d710.html" target="_blank" rel="external">学习数据库开发将来有哪些就业方向</a><ul>
<li>数据库应用开发 </li>
<li>数据建模专家 </li>
<li>商业智能专家 </li>
<li>ETL开发使用</li>
<li>数据构架师 </li>
<li>数据库管理员 </li>
<li>数据仓库专家 </li>
<li>数据仓库专家 </li>
<li>性能优化工程师 </li>
<li>高级数据库管理员 </li>
</ul>
</li>
<li><a href="http://www.cnblogs.com/konyel/archive/2011/06/06/mempool.html" target="_blank" rel="external">内存池完整实现代码及一些思考</a></li>
<li><a href="http://www.cnblogs.com/konyel/archive/2011/06/23/rbtree.html" target="_blank" rel="external">内存数据库内核开发-内存索引实现原理</a></li>
</ul>
<h4 id="2015-03-02"><a href="#2015-03-02" class="headerlink" title="2015-03-02"></a>2015-03-02</h4><ul>
<li><a href="http://www.ibm.com/developerworks/cn/linux/l-cn-ppp/index6.html" target="_blank" rel="external">C++ 应用程序性能优化，第 6 章：内存池</a></li>
<li>LIO<ul>
<li>130.200 无法启动target服务，但下午17:40的时候又试一次，发现可以启动了，不明白为什么!<br>[root@localhost ~]# service target status<br>Redirecting to /bin/systemctl status  target.service<br>target.service - Restore LIO kernel target configuration<br>   Loaded: loaded (/usr/lib/systemd/system/target.service; disabled)<br>   Active: active (exited) since Fri 2015-03-13 15:41:16 CST; 1h 58min ago<br>  Process: 3317 ExecStart=/usr/bin/targetctl restore (code=exited, status=0/SUCCESS)<br> Main PID: 3317 (code=exited, status=0/SUCCESS)<br>   CGroup: /system.slice/target.service<br>Mar 13 15:41:16 localhost.localdomain systemd[1]: Starting Restore LIO kernel target configuration…<br>Mar 13 15:41:16 localhost.localdomain systemd[1]: Started Restore LIO kernel target configuration.<br>Mar 13 15:41:29 localhost.localdomain systemd[1]: Started Restore LIO kernel target configuration.<br>Mar 13 17:39:38 localhost.localdomain systemd[1]: Started Restore LIO kernel target configuration.  </li>
<li>从上面的信息看，该服务在15:41:16就处于active状态了</li>
</ul>
</li>
</ul>
<h4 id="2015-02-28"><a href="#2015-02-28" class="headerlink" title="2015-02-28"></a>2015-02-28</h4><ul>
<li><a href="http://blog.csdn.net/aspirationflow/article/details/7694274" target="_blank" rel="external">Nmap扫描原理与用法</a></li>
<li>神威机器snmp问题<ul>
<li>mib下载失败是因为/etc/cf/conf/目录下不存在mib.tar文件</li>
<li>需要加入本公司的mib库源码重新编译, 才能得到磁盘组和各磁盘以及系统信息</li>
</ul>
</li>
</ul>
<h4 id="2015-02-27"><a href="#2015-02-27" class="headerlink" title="2015-02-27"></a>2015-02-27</h4><ul>
<li>LIO要做计划，预计两周完成</li>
<li>年终最少2个月</li>
<li>继续研究下神威的网络问题，无果.</li>
<li>年后第一天上班</li>
</ul>
<h4 id="2015-02-17"><a href="#2015-02-17" class="headerlink" title="2015-02-17"></a>2015-02-17</h4><ul>
<li>Nim语言引发关注 <ul>
<li><a href="http://www.solidot.org/story?sid=43082" target="_blank" rel="external">http://www.solidot.org/story?sid=43082</a></li>
<li><a href="https://github.com/Araq/Nim" target="_blank" rel="external">https://github.com/Araq/Nim</a></li>
<li><a href="http://nim-lang.org/" target="_blank" rel="external">http://nim-lang.org/</a></li>
</ul>
</li>
<li>今年最后一天上班, 年前不发年终奖，打酱油！！！</li>
</ul>
<h4 id="2015-02-16"><a href="#2015-02-16" class="headerlink" title="2015-02-16"></a>2015-02-16</h4><ul>
<li>神威机器, 现在外面又可以连接到里面了，但是会出现有时候卡的问题，而且莫名其妙<br>130.103IP不能访问了，只能从130.106访问.<ul>
<li>eth0: 172.16.130.106</li>
<li>eth1: 172.16.130.103</li>
<li>ping 172.16.50.39 -I eth0  成功</li>
<li>ping 172.16.50.39 -I eth1  失败</li>
<li>[root@yys ~]# route<br>Kernel IP routing table<br>Destination     Gateway         Genmask         Flags Metric Ref    Use Iface<br>default         172.16.130.1    0.0.0.0         UG    0      0        0 eth0<br>default         172.16.130.1    0.0.0.0         UG    0      0        0 eth1<br>172.16.130.0    <em>               255.255.255.0   U     0      0        0 eth1<br>172.16.130.0    </em>               255.255.255.0   U     0      0        0 eth0  </li>
<li>路由应该没有问题，因为前面正常访问两个IP的时候路由也是这样的.</li>
<li>[root@yys ~]# ping 172.16.130.107 -I eth0  失败<br>[root@yys ~]# ping 172.16.130.107 -I eth1  成功<br>[root@yys ~]# ping 172.16.50.39 -I eth0  成功<br>[root@yys ~]# ping 172.16.50.39 -I eth1  失败<br>[root@yys ~]# arp -a<br>? (172.16.130.107) at 00:24:ec:20:01:61 [ether] on eth0<br>? (172.16.130.107) at 00:24:ec:20:01:61 [ether] on eth1<br>? (172.16.130.1) at 00:0f:e2:b1:c7:5d [ether] on eth0<br>? (172.16.130.1) at 00:0f:e2:b1:c7:5d [ether] on eth1<br>[root@yys ~]# route<br>Kernel IP routing table<br>Destination     Gateway         Genmask         Flags Metric Ref    Use Iface<br>default         172.16.130.1    0.0.0.0         UG    0      0        0 eth0<br>default         172.16.130.1    0.0.0.0         UG    0      0        0 eth1<br>172.16.130.0    <em>               255.255.255.0   U     0      0        0 eth1<br>172.16.130.0    </em>               255.255.255.0   U     0      0        0 eth0  </li>
<li>为什么出现上面问题, 103 ping 107 OK, 106 ping 50.39 OK 其他失败.</li>
<li>通过ifconfig发现两者的 Bcast值不一样，eth0(106)的是172.16.130.255, eth1(103)的是0.0.0.0</li>
<li>通过ifconfig发现两者的 Bcast值不一样，eth0(106)的是172.16.130.255, eth1(103)的是0.0.0.0<br><code>ifconfig eth1 172.16.130.103 netmask 255.255.255.0</code>通过该命令修改成一样。<br><code>route add default gw 172.16.130.1 eth1</code>增加默认网关.<br>现在发现，50.39都无法访问130.106和130.103, 只能50.39先访问130.107,然后130.107访问130.106或130.103  </li>
<li>[root@yys ~]# who<br>root     pts/0        2015-02-16 15:16 (172.16.130.105)<br>root     pts/1        2015-02-16 12:40 (172.16.130.109)<br>root     pts/2        2015-02-16 15:46 (172.16.130.109)<br>root     pts/3        2015-02-16 15:49 (172.16.130.109)<br>root     pts/4        2015-02-16 15:59 (172.16.50.39)<br>root     pts/5        2015-02-16 16:15 (172.16.50.108)<br>root     pts/6        2015-02-16 16:21 (172.16.130.109)  </li>
<li>pkill -9 -t pts2/X, 只剩下当前的连接</li>
<li>ip addr 和 ifconfig没有看出问题，route命令发现default网关是eth1在前面，和这有关系吗?<br><code>route del default gw 172.16.130.1 eth0</code><br><code>route add default gw 172.16.130.1 eth0</code><br>先删除后增加，确保eth0的default网关在前面. 这个时候可以在50.39ping通130.106, 但103还不通.</li>
<li>哎，无解了！！！</li>
</ul>
</li>
<li><a href="http://george0052.blog.51cto.com/153095/147365" target="_blank" rel="external">Linux中增加软路由的两种方法/删除的方法</a></li>
<li>[root@yys ~]# route<br>Kernel IP routing table<br>Destination     Gateway         Genmask         Flags Metric Ref    Use Iface<br>default         172.16.130.1    0.0.0.0         UG    0      0        0 eth0<br>default         172.16.130.1    0.0.0.0         UG    0      0        0 eth1<br>172.16.0.0      <em>               255.255.0.0     U     0      0        0 eth0<br>172.16.130.0    </em>               255.255.255.0   U     1      0        0 eth1<br>[root@yys ~]# route del -net 172.16.0.0 netmask 255.255.0.0 dev eth0  </li>
<li>wireshark filter:<ul>
<li>按照某一IP地址范围过滤报文：ip.src &gt;172.16.130.1&amp;&amp;ip.src&lt;172.16.130.250</li>
<li><a href="http://www.yacer.cn/jishu/doc-128.html" target="_blank" rel="external">http://www.yacer.cn/jishu/doc-128.html</a></li>
</ul>
</li>
<li>tcpdump在神威平台上编译，alpha平台<ul>
<li>[root@yys tcpdump-4.6.2]# history |grep configure 查询到使用过的configure命令<br>看到有用到–build=sw_64-unknown-linux-gnu参数，试一试.</li>
<li>[root@yys tcpdump-4.6.2]# ./configure  –build=sw_64-unknown-linux-gnu<ul>
<li>configure: error: see the INSTALL doc for more info</li>
<li>查看了下INSTALL.txt，没有安装Libpcap也会有问题</li>
</ul>
</li>
<li>[root@yys libpcap-1.6.2]# ./configure  –build=sw_64-unknown-linux-gnu</li>
<li>[root@yys libpcap-1.6.2]# make</li>
<li>[root@yys libpcap-1.6.2]# make install</li>
<li>[root@yys tcpdump-4.6.2]# ./configure  –build=sw_64-unknown-linux-gnu 成功</li>
<li>[root@yys tcpdump-4.6.2]# make</li>
<li>测试<ul>
<li>本地机器50.39 [dennis@localhost ~]$ ping 172.16.130.106</li>
<li>问题机器130.106 [root@yys tcpdump-4.6.2]# ./tcpdump -n -e -i eth0 icmp<br>09:43:38.260219 00:0f:e2:b1:c7:5d &gt; 00:aa:00:64:10:74, ethertype IPv4 (0x0800),<br>   length 98: 172.16.50.39 &gt; 172.16.130.106: ICMP echo request, id 938, seq 1, length 64<br>09:43:39.259572 00:0f:e2:b1:c7:5d &gt; 00:aa:00:64:10:74, ethertype IPv4 (0x0800),<br>   length 98: 172.16.50.39 &gt; 172.16.130.106: ICMP echo request, id 938, seq 2, length 64<br>09:43:40.259551 00:0f:e2:b1:c7:5d &gt; 00:aa:00:64:10:74, ethertype IPv4 (0x0800),<br>   length 98: 172.16.50.39 &gt; 172.16.130.106: ICMP echo request, id 938, seq 3, length 64</li>
<li>发现: 只收到请求(request),没有回应数据(reply), 为什么?</li>
</ul>
</li>
<li>如果只出现request，那么做如下两个检查，看看是否ping被屏蔽了.<ul>
<li>1、检查sysctl -a | grep icmp_echo，确认net.ipv4.icmp_echo_ignore_all=0</li>
<li>2、检查iptables -vL，确认-p icmp为ACCPET</li>
<li>上面的检查都没有发现问题，但是就是只收到request，没有发出reply!!!</li>
<li><a href="http://foolishfish.blog.51cto.com/3822001/1532699" target="_blank" rel="external">通过tcpdump确认Linux系统是否收到和响应ping包</a></li>
</ul>
</li>
<li>其实想一想，上面的检查可以不用做，因为之前从130.107是可以ssh登陆到这台机器的，<br>当然也是可以ping通的，如果做了屏蔽ping的配置，那么应该也会屏蔽调130.107.<br>当然有可能遗漏一点，就是可能设置iptables的规则，刚好对130.107放行.</li>
<li>get mac with NetBIOS, 根据之前写的代码，查询172.16.130.1/24IP段的mac地址，没有发现重复.<ul>
<li>nmap -p139 192.168.50.1/24 | grep -B 3 ‘open’ | grep ‘scan’ | awk ‘{print $NF}’ | xargs -n1 ./netbios</li>
</ul>
</li>
</ul>
</li>
</ul>
<h4 id="2015-02-15"><a href="#2015-02-15" class="headerlink" title="2015-02-15"></a>2015-02-15</h4><ul>
<li>tcpdump无法在神威平台上编译，因为是alpha平台，执行./configure出现错误<ul>
<li>checking build system type… ./config.guess: unable to guess system type</li>
<li>configure: error: cannot guess build type; you must specify one</li>
<li>[root@yys ~]# uname -a<br>Linux yys 3.8.0-sw2f #1 SMP Fri Jan 16 08:37:13 CST 2015 sw_64 sw_64 sw_64 GNU/Linux</li>
<li>估计是要在./configure后面增加什么参数才可以.</li>
<li><a href="http://www.tcpdump.org/release/" target="_blank" rel="external">tcpdump source code download page</a></li>
</ul>
</li>
<li><a href="http://perlin.blog.51cto.com/1202304/1119539" target="_blank" rel="external">Linux踢出其他正在SSH登陆用户</a><ul>
<li>who</li>
<li>who am i</li>
<li>pkill -kill -t pts/1</li>
<li>pkill -9 -t pts/1</li>
</ul>
</li>
<li>问题: webgui上设置普通模式两ip失败，无法访问 <ul>
<li>ssh login 130.106，确认IP(130.107)设置成功</li>
<li>IP信息<br>[root@yys ~]# ip addr<br>1: lo: <loopback,up,lower_up> mtu 65536 qdisc noqueue state UNKNOWN   <pre><code>link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00  
inet 127.0.0.1/8 scope host lo  
inet6 ::1/128 scope host   
   valid_lft forever preferred_lft forever  
</code></pre>2: eth0: <broadcast,multicast,up,lower_up> mtu 1500 qdisc pfifo_fast state UP qlen 1000  <pre><code>link/ether 00:aa:00:64:10:74 brd ff:ff:ff:ff:ff:ff  
inet 172.16.130.106/24 scope global eth0  
inet6 fe80::2aa:ff:fe64:1074/64 scope link   
   valid_lft forever preferred_lft forever  
</code></pre>3: eth1: <broadcast,multicast,up,lower_up> mtu 1500 qdisc pfifo_fast state UP qlen 1000  <pre><code>link/ether 00:aa:00:64:10:75 brd ff:ff:ff:ff:ff:ff  
inet 172.16.130.87/16 brd 172.16.255.255 scope global eth1  
inet6 fe80::2aa:ff:fe64:1075/64 scope link   
   valid_lft forever preferred_lft forever  
</code></pre>4: eth2: <no-carrier,broadcast,multicast,up> mtu 1500 qdisc pfifo_fast state DOWN qlen 1000  <pre><code>link/ether 00:aa:00:64:10:76 brd ff:ff:ff:ff:ff:ff  
</code></pre>5: eth3: <no-carrier,broadcast,multicast,up> mtu 1500 qdisc pfifo_fast state DOWN qlen 1000  <pre><code>link/ether 00:aa:00:64:10:77 brd ff:ff:ff:ff:ff:ff  
</code></pre></no-carrier,broadcast,multicast,up></no-carrier,broadcast,multicast,up></broadcast,multicast,up,lower_up></broadcast,multicast,up,lower_up></loopback,up,lower_up></li>
<li>从我的机器50.39无法ping通上面两个IP(130.106,130.87)</li>
<li>从另外一台同一个交换机的机器130.107，可以ping通上面两个IP(130.106,130.87)</li>
<li>路由表信息<br>[root@yys ~]# route<br>Kernel IP routing table<br>Destination     Gateway         Genmask         Flags Metric Ref    Use Iface<br>default         172.16.130.1    0.0.0.0         UG    0      0        0 eth0<br>172.16.0.0      <em>               255.255.0.0     U     0      0        0 eth1<br>172.16.130.0    </em>               255.255.255.0   U     0      0        0 eth0  </li>
<li>从上面的路由表信息可以看到eth0配置了default信息, eth1没有</li>
<li>下面是可以正常连线的另外一台机器的路由表信息<br>[root@DCN ~]# route<br>Kernel IP routing table<br>Destination     Gateway         Genmask         Flags Metric Ref    Use Iface<br>172.16.130.0    <em>               255.255.255.0   U     0      0        0 eth1<br>172.16.130.0    </em>               255.255.255.0   U     0      0        0 eth0<br>default         172.16.130.1    0.0.0.0         UG    0      0        0 eth0<br>default         172.16.130.1    0.0.0.0         UG    0      0        0 eth1  </li>
<li>网络上学习IP路由工作原理<ul>
<li><a href="http://yuangeqingtian.blog.51cto.com/6994701/1218946" target="_blank" rel="external">linux下路由表详解</a></li>
</ul>
</li>
<li>使用命令arp -a, 后路由信息如下, 本地(50.39)还是无法ping通.<br>[root@yys ~]# route<br>Kernel IP routing table<br>Destination     Gateway         Genmask         Flags Metric Ref    Use Iface<br>default         172.16.130.1    0.0.0.0         UG    0      0        0 eth1<br>172.16.130.0    <em>               255.255.255.0   U     0      0        0 eth0<br>172.16.130.0    </em>               255.255.255.0   U     1      0        0 eth1  </li>
<li>[root@yys ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0<br>DEVICE=”eth0”<br>BOOTPROTO=none<br>NM_CONTROLLED=”yes”<br>ONBOOT=”no”<br>TYPE=”Ethernet”<br>UUID=”3e138003-0cbc-4bc9-b1ca-9f96cc905ebc”<br>IPADDR=172.16.110.105<br>PREFIX=24<br>GATEWAY=172.16.110.1<br>DEFROUTE=yes<br>IPV4_FAILURE_FATAL=yes<br>IPV6INIT=no<br>NAME=”System eth0”<br>HWADDR=00:AA:00:64:10:74  </li>
<li>是否可以使用tcpdump看看是否外面的IP(50.39)的ping包(icmp包)可以发送到达130.106<ul>
<li>但是，现在无法在130.106机器上编译tcpdump，该机器是alpha架构。</li>
<li>虽然无法从130.106 ping到50.39,但是反过来是通的(50.39可以ping通130.106).</li>
<li>屏蔽ping的操作: <code>echo &#39;net.ipv4.icmp_echo_ignore_all=1&#39;&gt;&gt; /etc/sysctl.conf</code><br><a href="http://daddysgirl.blog.51cto.com/1598612/1185170" target="_blank" rel="external">http://daddysgirl.blog.51cto.com/1598612/1185170</a></li>
<li><a href="http://blog.sina.com.cn/s/blog_53fab15a0101byw1.html" target="_blank" rel="external">屏蔽别人ping的iptables设置</a></li>
<li>grep -i icmp /etc/sysctl.conf, 没有发现做屏蔽ping的限制</li>
<li>iptables -L |grep -i icmp, 没有发现做屏蔽ping的限制</li>
</ul>
</li>
<li>参考链接<ul>
<li><a href="http://linux.vbird.org/linux_server/0150detect_network.php" target="_blank" rel="external">Linux 網路偵錯</a></li>
<li><a href="http://my.oschina.net/jing31/blog/6611" target="_blank" rel="external">Linux双网卡设置IP属于同一网段的问题</a></li>
<li><a href="http://os.51cto.com/art/201205/339800.htm" target="_blank" rel="external">Linux系统IP路由的工作原理</a></li>
<li><a href="http://linux.vbird.org/linux_server/0230router.php" target="_blank" rel="external">路由觀念與路由器設定</a></li>
<li><a href="http://my.oschina.net/guol/blog/156607" target="_blank" rel="external">Linux策略路由</a></li>
<li><a href="http://yuangeqingtian.blog.51cto.com/6994701/1218946" target="_blank" rel="external">linux下路由表详解</a></li>
</ul>
</li>
<li>查询路由信息<ul>
<li>route -n </li>
<li>netstat -rn</li>
</ul>
</li>
<li>reboot重启系统看看, 发现重新启动后可以正常连接了，页面也可以正常访问了。</li>
<li>[root@yys ~]# route -n<br>Kernel IP routing table<br>Destination     Gateway         Genmask         Flags Metric Ref    Use Iface<br>0.0.0.0         172.16.130.1    0.0.0.0         UG    0      0        0 eth0<br>0.0.0.0         172.16.130.1    0.0.0.0         UG    0      0        0 eth1<br>169.254.0.0     0.0.0.0         255.255.0.0     U     1003   0        0 eth1<br>172.16.130.0    0.0.0.0         255.255.255.0   U     0      0        0 eth1<br>172.16.130.0    0.0.0.0         255.255.255.0   U     0      0        0 eth0  </li>
<li>路由表信息变化了</li>
<li>页面设置eth1ip后，访问出现问题了。。。是不是调用的命令有问题? 而且从也无法<br>ping到50.39了</li>
</ul>
</li>
<li>问题: iscsi 不支持 “SCSI-3 Persistent Reservation”功能” <ul>
<li>Persistent Reservation, 是持久保留的意思</li>
<li><a href="http://rickyfang.blog.51cto.com/1213/125151" target="_blank" rel="external">Windows Server 故障转移群集</a><ul>
<li>验证过程中的其中一项存储测试将验证此功能。如果某个存储解决方案并不支持 SCSI-3 (PR) 命令，<br>则“故障转移群集”也将不支持它。 </li>
</ul>
</li>
<li><a href="http://linux-iscsi.org/wiki/Persistent_Reservations" target="_blank" rel="external">当前最新版本的LIO支持SCSI-3 Persistent Reservation</a></li>
<li>IET、STGT不支持, <a href="http://linux-iscsi.org/wiki/Features" target="_blank" rel="external">http://linux-iscsi.org/wiki/Features</a></li>
<li>参考IET 2008年的邮件内容 <a href="http://sourceforge.net/p/iscsitarget/mailman/message/19984639/" target="_blank" rel="external">http://sourceforge.net/p/iscsitarget/mailman/message/19984639/</a><ul>
<li>Ross 说在不远的将来会支持</li>
<li>Ming Zhang 暂不支持，也还没有计划.</li>
</ul>
</li>
<li>另外，可以搜索邮件列表中关于Persistent Reservation的信息<ul>
<li><a href="http://sourceforge.net/p/iscsitarget/mailman/search/?q=Persistent+Reservation&amp;mail_list=iscsitarget-devel" target="_blank" rel="external">http://sourceforge.net/p/iscsitarget/mailman/search/?q=Persistent+Reservation&amp;mail_list=iscsitarget-devel</a></li>
<li><a href="http://sourceforge.net/p/iscsitarget/mailman/search/?q=Persistent+Reservation&amp;mail_list=iscsitarget-commits" target="_blank" rel="external">http://sourceforge.net/p/iscsitarget/mailman/search/?q=Persistent+Reservation&amp;mail_list=iscsitarget-commits</a></li>
<li>通过在commits中搜索，发现是在2011年才有PRs</li>
<li><a href="http://sourceforge.net/p/iscsitarget/mailman/message/28022461/" target="_blank" rel="external">http://sourceforge.net/p/iscsitarget/mailman/message/28022461/</a> 可以看到在2011-08-31才有patch贡献出来.</li>
<li>查看最新版svn rev 503的source code, kernel/persis.{h,c}, 发现copyright也是2011年</li>
<li>说明Persistent Reservation应该是在2011年才加入IET</li>
</ul>
</li>
<li>再看IET正式的Release版本<ul>
<li><a href="http://sourceforge.net/projects/iscsitarget/files/iscsitarget/" target="_blank" rel="external">http://sourceforge.net/projects/iscsitarget/files/iscsitarget/</a> 最新版本1.4.20.2是2010-07-15，<br>说明最新版是不支持Persistent Reservation的.</li>
</ul>
</li>
<li>SCSI-3 PR就是一组SCSI命令集，用在多个系统访问一个共享存储的时候协调之用。<br>并且于旧的命令集不兼容。Windows 2008用SCSI-3 PR，而Windows 2003用SCSI-2。<br>当Windows 2003访问SCSI-3的共享存储的时候，会发生错误，MS KB911030解释了这个bug<ul>
<li><a href="http://blog.sina.com.cn/s/blog_537d1d300100lka6.html" target="_blank" rel="external">http://blog.sina.com.cn/s/blog_537d1d300100lka6.html</a></li>
</ul>
</li>
<li><a href="http://blog.csdn.net/kinges/article/details/17548613" target="_blank" rel="external">SCSI锁</a><ul>
<li>通常来讲目前SCSI锁有两种类型：SCSI-2Reservation和SCSI-3 Reservation，这里<br>SCSI-3Reservation也称之为Persistent Reservation。这两种类型的的锁是不能共存在一个Lun上的。</li>
</ul>
</li>
<li><a href="http://tilt.lib.tsinghua.edu.cn/node/824" target="_blank" rel="external">SCSI访问控制原理介绍</a></li>
<li><a href="https://community.emc.com/docs/DOC-21441" target="_blank" rel="external">SCSI访问控制原理介绍</a></li>
<li><a href="https://community.emc.com/docs/DOC-20876" target="_blank" rel="external">存储SCSI锁解读：Windows Cluster篇</a></li>
</ul>
</li>
</ul>
<h4 id="2015-02-13"><a href="#2015-02-13" class="headerlink" title="2015-02-13"></a>2015-02-13</h4><ul>
<li><a href="http://blog.csdn.net/namesliu/article/details/5708172" target="_blank" rel="external">linux 下C语言实现 读取网卡速度</a></li>
<li>为什么客户获取万兆网卡的速度是10M呢?<ul>
<li>[dennis@localhost net-snmp-5.4.4]$ grep -rn –include=<em>.{h,c} ifSpeed ./<br>发现一个可疑文件./agent/mibgroup/if-mib/ifXTable/ifXTable.c:1271:<br>(</em>ifHighSpeed_val_ptr) = rowreq_ctx-&gt;data.ifSpeed / 1000000; </li>
<li>打开该c文件, 可以通过OID获取”.1.3.6.1.2.1.31.1.1.1.15”</li>
<li>[dennis@localhost net-snmp-5.4.4]$ snmpwalk -v2c -c public 172.16.130.90 ifspeed</li>
<li>[dennis@localhost net-snmp-5.4.4]$ snmpwalk -v2c -c public 172.16.130.90 .1.3.6.1.2.1.31.1.1.1.15<br>IF-MIB::ifHighSpeed.1 = Gauge32: 10<br>IF-MIB::ifHighSpeed.2 = Gauge32: 0<br>IF-MIB::ifHighSpeed.3 = Gauge32: 1000<br>IF-MIB::ifHighSpeed.4 = Gauge32: 10<br>IF-MIB::ifHighSpeed.5 = Gauge32: 10<br>IF-MIB::ifHighSpeed.7 = Gauge32: 10  </li>
<li>[dennis@localhost net-snmp-5.4.4]$ snmpwalk -v2c -c public 172.16.130.90 ifdesc<br>IF-MIB::ifDescr.1 = STRING: lo<br>IF-MIB::ifDescr.2 = STRING: eth1<br>IF-MIB::ifDescr.3 = STRING: eth0<br>IF-MIB::ifDescr.4 = STRING: eth2<br>IF-MIB::ifDescr.5 = STRING: eth3<br>IF-MIB::ifDescr.7 = STRING: bond0  </li>
<li>得到的eth2和eth3是10</li>
<li>在存储服务器上查询速度:<br>[root@localhost ~]# ethtool  eth3 |grep Speed<br>Speed: 10000Mb/s<br>[root@localhost ~]# ethtool  eth2 |grep Speed<br>Speed: 10000Mb/s<br>[root@localhost ~]# ethtool  eth0 |grep Speed<br>Speed: 1000Mb/s  </li>
<li>得到的速度是10000</li>
<li>也就是说这个值rowreq_ctx-&gt;data.ifSpeed有问题， 那么哪里给它赋值的呢?</li>
<li>./agent/mibgroup/if-mib/ifTable/ifTable_defs.h:4:#define ifSpeed ifentry-&gt;speed<br>注意这里做了宏替换</li>
<li>调用关系:<ul>
<li>./agent/mibgroup/host/hr_network.c:221:    Interface_Scan_Init();</li>
<li>./agent/mibgroup/if-mib/data_access/interface.c:159:<br>rc =  netsnmp_arch_interface_container_load(container, load_flags);</li>
<li>./agent/mibgroup/if-mib/data_access/interface_sysctl.c:489:<br>netsnmp_sysctl_get_if_speed(entry-&gt;name, &amp;entry-&gt;speed,</li>
</ul>
</li>
<li>最终:<ul>
<li>s = socket(AF_INET, SOCK_DGRAM, 0)</li>
<li>ioctl(s, SIOCGIFMEDIA, (caddr_t)&amp;ifmr)</li>
</ul>
</li>
<li>还有可能是 ./agent/mibgroup/if-mib/data_acces/interface_linux.c中的函数<br>netsnmp_linux_interface_get_if_speed通过 ioctl(fd, SIOCETHTOOL, &amp;ifr) 获取的网速</li>
<li>[root@localhost ~]# snmpd –version<br>NET-SNMP version:  5.4.2 </li>
<li>版本5.4.2是否不支持万兆?该版本是2008发行的<ul>
<li><a href="http://sourceforge.net/projects/net-snmp/files/OldFiles/net-snmp-5.4.x/5.4.2/" target="_blank" rel="external">http://sourceforge.net/projects/net-snmp/files/OldFiles/net-snmp-5.4.x/5.4.2/</a></li>
<li>该版本netsnmp_linux_interface_get_if_speed 函数:<br>if (edata.speed != SPEED_10 &amp;&amp; edata.speed != SPEED_100 &amp;&amp;  <pre><code>edata.speed != SPEED_1000) {  
DEBUGMSGTL((&quot;mibII/interfaces&quot;, &quot;fallback to mii for %s\n&quot;,  
            ifr.ifr_name));  
/* try MII */  
return netsnmp_linux_interface_get_if_speed_mii(fd,name);  
</code></pre>}  </li>
</ul>
</li>
<li>想办法查看 5.4.2 DEBUGMSGTL输出<ul>
<li>/usr/sbin/snmpd -c /etc/snmp/snmpd.conf -Le </li>
<li>这样跑: <code>/usr/sbin/snmpd -c /etc/snmp/snmpd.conf -d -L -DmibII/interfaces</code><br>mibII/interfaces: SIOCGMIIREG on eth1 failed<br>mibII/interfaces: No link…<br>mibII/interfaces: ETHTOOL_GSET on eth0 speed = 1000<br>mibII/interfaces: fallback to mii for eth2<br>mibII/interfaces: SIOCGMIIPHY on eth2 failed<br>mibII/interfaces: fallback to mii for eth3<br>mibII/interfaces: SIOCGMIIPHY on eth3 failed<br>mibII/interfaces: ETHTOOL_GSET on bond0 failed<br>mibII/interfaces: Auto-negotiation disabled.  </li>
<li>下载5.7.3版本，编译，执行<code>./agent/snmpd -c /etc/snmp/snmpd.conf -d -L -DmibII/interfaces</code><br>mibII/interfaces: ETHTOOL_GSET on eth1 speed = 0xffffffff -&gt; 0<br>mibII/interfaces: ETHTOOL_GSET on eth0 speed = 0x3e8 -&gt; 1000<br>mibII/interfaces: ETHTOOL_GSET on eth2 speed = 0x2710 -&gt; 10000<br>mibII/interfaces: ETHTOOL_GSET on eth3 speed = 0x2710 -&gt; 10000<br>mibII/interfaces: ETHTOOL_GSET on bond0 failed (-1 / 0)  </li>
<li>[dennis@localhost net-snmp-5.4.4]$ snmpwalk -v2c -c public 172.16.130.90 ifhighspeed</li>
<li>[dennis@localhost net-snmp-5.4.4]$ snmpwalk -v2c -c public 172.16.130.90 .1.3.6.1.2.1.31.1.1.1.15<br>IF-MIB::ifHighSpeed.1 = Gauge32: 10<br>IF-MIB::ifHighSpeed.2 = Gauge32: 0<br>IF-MIB::ifHighSpeed.3 = Gauge32: 1000<br>IF-MIB::ifHighSpeed.4 = Gauge32: 10000<br>IF-MIB::ifHighSpeed.5 = Gauge32: 10000<br>IF-MIB::ifHighSpeed.7 = Gauge32: 10   </li>
<li>可见新版本获取的是万兆速度了。</li>
</ul>
</li>
</ul>
</li>
<li>net-snmp, 获取网络速度<ul>
<li>snmpwalk -v2c -c public 172.16.130.90 ifSpeed</li>
<li>snmpwalk -v2c -c public 172.16.130.90 .1.3.6.1.2.1.2.2.1.5</li>
<li>./agent/mibgroup/if-mib/ifTable/ifTable.c, 函数ifSpeed_get </li>
<li><a href="http://www.freeoa.net/osuport/netmanage/get-host-net-traffice-info-by-snmp_1979.html" target="_blank" rel="external">使用snmp取得主机网络流量信息</a></li>
</ul>
</li>
<li>linux tar 命令，报错 tar: Removing leading `/‘ from member names<ul>
<li>不是错误，是tar删除了绝对路径最开始 / 而进行的提搜索示 </li>
<li>cd /var/home &amp;&amp; tar -zcf aa.tar.gz cc.wav dd.wav</li>
</ul>
</li>
<li>用shell获取目录/文件夹/文件的时间戳  <ul>
<li>date +%s -r 目录名/文件名 </li>
</ul>
</li>
<li>Linux使用shell脚本定时备份文件（夹）并删除一定日期之前的备份和日志<ul>
<li><a href="http://xiongyingqi.com/linux/2014/01/04/linux-backup-shell.html" target="_blank" rel="external">http://xiongyingqi.com/linux/2014/01/04/linux-backup-shell.html</a></li>
</ul>
</li>
</ul>
<h4 id="2015-02-12"><a href="#2015-02-12" class="headerlink" title="2015-02-12"></a>2015-02-12</h4><ul>
<li>编写完iscsi问题系统信息搜集脚本, 日志目录/tmp/diagnosis/iscsi-log，这样页面运行<br>系统诊断时，可以直接下载日志。</li>
<li>★★★<a href="http://blog.csdn.net/happydeer/article/details/17023229" target="_blank" rel="external">最牛B的编码套路</a></li>
<li>tcpdump<ul>
<li>截获主机210.27.48.1 和主机210.27.48.2 或210.27.48.3的通信<br><code>tcpdump host 210.27.48.1 and \ (210.27.48.2 or 210.27.48.3 \)</code></li>
<li>截获主机hostname发送的所有数据 <code>tcpdump -i eth0 src host hostname</code></li>
<li>监视所有送到主机hostname的数据包 <code>tcpdump -i eth0 dst host hostname</code></li>
<li><a href="http://blog.h2ero.cn/wiki/tcpdump.html" target="_blank" rel="external">http://blog.h2ero.cn/wiki/tcpdump.html</a></li>
<li><a href="http://www.cnblogs.com/ggjucheng/archive/2012/01/14/2322659.html" target="_blank" rel="external">http://www.cnblogs.com/ggjucheng/archive/2012/01/14/2322659.html</a></li>
</ul>
</li>
</ul>
<h4 id="2015-02-11"><a href="#2015-02-11" class="headerlink" title="2015-02-11"></a>2015-02-11</h4><ul>
<li>tcpdump实时保存每个数据包到文件，增加-U参数<ul>
<li>-U使得当tcpdump在使用-w 选项时, 其文件写入与包的保存同步.(nt: 即,当每个数据<br>包被保存时,它将及时被写入文件中,而不是等文件的输出缓冲已满时才真正写入此文件)</li>
<li>参考 <a href="http://blog.h2ero.cn/wiki/tcpdump.html" target="_blank" rel="external">http://blog.h2ero.cn/wiki/tcpdump.html</a></li>
</ul>
</li>
<li>编写诊断(diagnosis)脚本, 参考以前写的dmon.sh<ul>
<li>tcpdump -U port 3260 -w /root/tcpdump.pcap  立即保存每一个数据包到文件</li>
</ul>
</li>
<li>分析为什么出现<ul>
<li><strong>EXT3-fs (sda3): orphan cleanup on readonly fs</strong></li>
<li><strong>ext3_orphan_cleanup: truncating inode 8083 to 0 bytes</strong></li>
<li><strong>EXT3-fs (sda3): 1 truncate cleaned up</strong></li>
<li>查找<br>[dennis@localhost ext3]$ pwd<br>/home/dennis/work/kernel/linux-2.6.32-279.el6/fs/ext3<br>[dennis@localhost ext3]$ grep -rn “truncating inode .<em> to .</em> bytes” ./<br>./super.c:1501:         “%s: truncating inode %lu to %Ld bytes\n”,<br>./super.c:1503:  jbd_debug(2, “truncating inode %lu to %Ld bytes\n”,  </li>
<li>分析super.c的函数ext3_orphan_cleanup</li>
<li><a href="http://www.oenhan.com/fs-orphan-inode-analysis" target="_blank" rel="external">文件系统orphan inode机制分析</a><ul>
<li>lsof /tmp |grep delete<br>gnome-she 1757 dennis   18u   REG   0,35    12288  26789 /tmp/ffi8DfHM7 (deleted)<br>gnome-ter 2058 dennis   18u   REG   0,35        0  29398 /tmp/#29398 (deleted)<br>gnome-ter 2058 dennis   20u   REG   0,35        0  29400 /tmp/#29400 (deleted)  </li>
<li>[dennis@localhost ext3]$ ll /tmp/ffi8DfHM7<br>ls: cannot access /tmp/ffi8DfHM7: No such file or directory  </li>
<li>/tmp/ffi8DfHM7文件就成为orphan文件，12288是文件的inode，称之为orphan inode </li>
<li>Orphan inode，顾名思义就是孤儿节点，是Linux ext系列文件系统结构中节点的一种，<br>orphan意指的是被删除，无主的节点。</li>
</ul>
</li>
</ul>
</li>
<li>CentOS 2.6.32-279源代码下载<ul>
<li><a href="http://vault.centos.org/6.3/os/Source/SPackages/" target="_blank" rel="external">http://vault.centos.org/6.3/os/Source/SPackages/</a></li>
<li><a href="http://vault.centos.org/6.3/os/Source/SPackages/kernel-2.6.32-279.el6.src.rpm" target="_blank" rel="external">http://vault.centos.org/6.3/os/Source/SPackages/kernel-2.6.32-279.el6.src.rpm</a></li>
</ul>
</li>
<li>Linux下使用360随身WiFi, Fedora 21验证, 以下为操作步骤:<ul>
<li>插入usb wifi</li>
<li>lsusb<ul>
<li>Bus 001 Device 007: ID 148f:760b Ralink Technology, Corp. MT7601U Wireless Adapter</li>
</ul>
</li>
<li>git clone <a href="https://github.com/eywalink/mt7601u.git" target="_blank" rel="external">https://github.com/eywalink/mt7601u.git</a> </li>
<li>yum install kernel-devel -y</li>
<li>yum install dhcp -y</li>
<li>vim /etc/dhcp/dhcpd.conf, 加入如下配置:<br>subnet 192.168.199.0 netmask 255.255.255.0 {<br>   range 192.168.199.10 192.168.199.20;<br>   option routers 192.168.199.1;<br>   option domain-name-servers 8.8.8.8;<br>}  </li>
<li>cd mt7601u</li>
<li>sh miwifi_build.sh</li>
<li>vim miwifi_work.sh, 修改eth0为你的机器上网的网口, 例如我这边要修改为enp2s0<ul>
<li>iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE</li>
</ul>
</li>
<li>sh miwifi_work.sh</li>
<li>ifconfig 确认ra0起来,并且分配了IP</li>
<li>后期如果需要修改SSID和密码，修改/etc/Wireless/RT2870AP/RT2870AP.dat <ul>
<li>ifconfig ra0 down</li>
<li>SSID=WiFi_TEST    这是wifi名</li>
<li>WPAPSK=TEST2015   这是密码</li>
<li>ifconfig ra0 up</li>
</ul>
</li>
<li><a href="http://www.freemindworld.com/blog/2013/131010_360_wifi_in_linux.shtml" target="_blank" rel="external">http://www.freemindworld.com/blog/2013/131010_360_wifi_in_linux.shtml</a></li>
<li><a href="http://blog.csdn.net/sumang_87/article/details/38168877" target="_blank" rel="external">http://blog.csdn.net/sumang_87/article/details/38168877</a></li>
</ul>
</li>
<li>vim 本次搜索忽略大小写, /\cYOUR_SEARCH_WORDS, 或者, /YOUR_SEARCH_WORDS\c</li>
<li>继续DCN <ul>
<li>查看dmesg<ul>
<li>EXT3-fs (sda3): recovery required on readonly filesystem</li>
<li>EXT3-fs (sda3): write access will be enabled during recovery</li>
<li>kjournald starting.  Commit interval 5 seconds</li>
<li><strong>EXT3-fs (sda3): orphan cleanup on readonly fs</strong></li>
<li><strong>ext3_orphan_cleanup: truncating inode 8083 to 0 bytes</strong></li>
<li><strong>EXT3-fs (sda3): 1 truncate cleaned up</strong></li>
<li>EXT3-fs (sda3): recovery complete</li>
<li>EXT3-fs (sda3): mounted filesystem with ordered data mode</li>
</ul>
</li>
<li>查看本地测试正常的dmesg<ul>
<li>EXT3-fs (sda3): recovery required on readonly filesystem</li>
<li>EXT3-fs (sda3): write access will be enabled during recovery</li>
<li>kjournald starting.  Commit interval 5 seconds</li>
<li>EXT3-fs (sda3): recovery complete</li>
<li>EXT3-fs (sda3): mounted filesystem with ordered data mode</li>
</ul>
</li>
</ul>
</li>
</ul>
<h4 id="2015-02-10"><a href="#2015-02-10" class="headerlink" title="2015-02-10"></a>2015-02-10</h4><ul>
<li>feedly.com, google reader 后继版本</li>
<li>升级工作原理<ul>
<li>找一个升级包，解压看看内容</li>
<li>升级包解压密码文件:/opt/scripts/common/sys_clear_all </li>
</ul>
</li>
<li>关于万兆网卡网口频繁断开又连接问题<ul>
<li>diagnosis/logfile, 查看到bond0当前mac是eth3的， bond1的mac是eth1的<ul>
<li>bond0, 192.168.10.10, 邮件里说是192.168.1.0应该, 查看了下，应该是后面又修改为普通IP的。</li>
<li>bond1, 10.24.2.190,</li>
</ul>
</li>
</ul>
</li>
<li>由于这些日志都是在存储连接正常的情况下获取的，不能从中得到有用信息，那么如何在<br>存储出现问题的时候自动得到一些信息呢?<ul>
<li>增加wireshark抓包</li>
<li>技术支持拿回来的包是怎么抓取的?<ul>
<li>页面选择，系统-&gt;系统诊断-&gt;诊断</li>
<li>sysCheck.php call add_sys_check() </li>
<li>system_check.inc, add_sys_check() run exec_common(“diagnosis $bkpath$timestamp.’tar.gz’”) </li>
<li>/opt/scripts/common/diagnosis</li>
<li>pvs &gt;&gt; ${dspath}/lvm/pvs 2&gt;&amp;1 &amp;</li>
<li>lvs &gt;&gt; ${dspath}/lvm/lvs 2&gt;&amp;1 &amp;</li>
<li>ps auxf &gt;${dspath}/sys/psfile</li>
<li>netstat -an &gt;&gt; ${dspath}/logfile</li>
<li>ip addr &gt;&gt; ${dspath}/logfile</li>
<li>netstat -anp | grep 3260 &gt;${dspath}/iscsi/iscsi_conninfo</li>
</ul>
</li>
</ul>
</li>
<li>继续分析DCN iscsi连接问题的日志<ul>
<li>diagnosis/iscsi/iscsi_conninfo, 存储IP:192.168.1.101, 服务器:192.168.1.16</li>
<li>diagnosis/iscsi/initiator.allow, 允许192.168.1.16访问iqn.2007-10.DCN.com:zhu1.1</li>
<li>diagnosis/iscsi/session, 当前会话: <ul>
<li>tid:1 name:iqn.2007-10.DCN.com:zhu1.1</li>
<li>sid:562950876233792 initiator:iqn.1991-05.com.microsoft:win-779iu2vuh5u</li>
<li>cid:1 ip:192.168.1.16 state:active hd:none dd:none tip:192.168.1.101</li>
</ul>
</li>
<li>diagnosis/iscsi/volume,<ul>
<li>tid:1 name:iqn.2007-10.DCN.com:zhu1.1</li>
<li>lun:0 state:0 iotype:fileio iomode:wb blocks:5126866432 blocksize:4096 path:/dev/zhu1/1</li>
</ul>
</li>
<li>diagnosis/logfile<ul>
<li>mdadm information</li>
<li>[&gt;………………..]  resync =  2.9% (86468096/2930266432) finish=1115.2min speed=42500K/sec</li>
<li>看起来，raid正在作同步工作?</li>
<li>nestat  information: 192.168.1.16正连接到192.168.1.101的3260端口</li>
<li>ip addr information: 只配置了192.168.1.101一个IP地址</li>
</ul>
</li>
<li>diagnosis/sys/dmesg<ul>
<li>ADDRCONF(NETDEV_UP): eth0: link is not ready</li>
<li>ADDRCONF(NETDEV_UP): eth1: link is not ready</li>
<li>ADDRCONF(NETDEV_UP): eth2: link is not ready</li>
<li>ADDRCONF(NETDEV_UP): eth3: link is not ready</li>
<li>ADDRCONF(NETDEV_UP): eth4: link is not ready</li>
<li>ADDRCONF(NETDEV_UP): eth5: link is not ready</li>
<li>ADDRCONF(NETDEV_CHANGE): eth0: link becomes ready</li>
<li>因为只有eth0是连接的，所以后面出现这个就没有问题了</li>
</ul>
</li>
<li>diagnosis/sys/psfile<ul>
<li>只有3个和ist相关进程,istd1,istiod1,istiod1</li>
</ul>
</li>
<li>diagnosis/sys/uitos-release: NCS3600_1.0.2_19769_20140218 </li>
<li>diagnosis/sys/log/ucli.log, 为什么会出现chap错误, 理论只有页面查看iscsi卷信息<br>并且磁盘组或逻辑卷有问题才有可能出问题，涉及文件/etc/{ietd.conf,iscsi.user},  <ul>
<li>[2015/01/30-15:00:43][error]<a href="">0x00020006</a>iscsi chap query err[0x00020006]:</li>
<li>[2015/02/02-13:42:09][error]<a href="">0x00020006</a>iscsi chap query err[0x00020006]:</li>
<li>[2015/02/09-15:38:43][error]<a href="">0x00020006</a>iscsi chap query err[0x00020006]: </li>
</ul>
</li>
</ul>
</li>
</ul>
<h4 id="2015-02-09"><a href="#2015-02-09" class="headerlink" title="2015-02-09"></a>2015-02-09</h4><ul>
<li>学习消息队列中间件</li>
<li>低空领域的开发，将原来新的一轮IT发展高潮</li>
<li>IET是如何设置Sector大小的?<ul>
<li>1.ietadm –op new –tid=%d –lun=%d –params Path=/dev/dg_name/vd_name,IOMode=%s,Sector=%s,Type=%s</li>
<li>2.iet/usr/</li>
<li>3.iet/kernel/</li>
</ul>
</li>
<li>smsb(DCN) iscsi issue<ul>
<li>查看./diagnosis/sys/log/ucli.log, 发现有”iscsi chap query err”</li>
<li>chap error<ul>
<li>vd_mngt.c   iscsi_chap –list</li>
<li>iscsi.c   iscsi_target_query_user -&gt; find_conf_target(trgt_name) -&gt; regex_cmp_file (ISCSI_CONF_FILE, pattern) </li>
<li>iscsi.c   iscsi_target_query_user -&gt; fopen (ISCSI_USER_FILE, “r”) </li>
<li>iscsi.h   define ISCSI_CONF_FILE “/etc/ietd.conf” </li>
<li>iscsi.h   define ISCSI_USER_FILE “/etc/iscsi.user” </li>
</ul>
</li>
<li>查看日志目录文件 ./diagnosis/iscsi/ietd.conf ./diagnosis/iscsi/iscsi.user，<br>文件存在，且有正则表达式匹配内容。</li>
<li>总结，当执行ucli vd_chap –list -d dg_name -v lv_name 时才会出现chap error。<br>而且只有当在ietd.conf中找不到和target名匹配的字符串时，或打开iscsi.user失败<br>时才会报错。 而这个命令应该只有在页面查看iscsi卷信息时才会被调用。</li>
<li>查看出现错误时间，date +%s -d”Feb 2, 2015 13:42:09”，得到对应的时间戳1422855729 </li>
<li>解压可能包含错误信息的日志包: tar xvf 1422859264.tar.gz，查看./dev/shm/core/messages<br>没有发现可疑的地方。</li>
</ul>
</li>
<li><a href="http://benjr.tw/538" target="_blank" rel="external">Linux 修改物理扇区Secotr大小</a><ul>
<li>sg_format –format –size=520 /dev/sdd </li>
</ul>
</li>
</ul>
<h4 id="2015-02-06"><a href="#2015-02-06" class="headerlink" title="2015-02-06"></a>2015-02-06</h4><ul>
<li>Linux yes命令用途, 用在交互命令中自动选择. yes默认是输出y<ul>
<li>for el in <code>seq 1 10</code>;do read -p ‘continue?[y/n]’;echo ${el}; done </li>
<li>yes |for el in <code>seq 1 10</code>;do read -p ‘continue?[y/n]’;echo ${el}; done </li>
<li>yes n |for el in <code>seq 1 10</code>;do read -p ‘continue?[y/n]’;echo ${el}; done </li>
<li><a href="http://blog.chinaunix.net/uid-24981550-id-3342765.html" target="_blank" rel="external">http://blog.chinaunix.net/uid-24981550-id-3342765.html</a></li>
</ul>
</li>
<li>read source code of coreutils-8.23<ul>
<li>basename.c</li>
<li>cat.c</li>
<li>cp.c</li>
<li>dd.c</li>
<li>yes.c</li>
<li>一个都看不懂…</li>
</ul>
</li>
<li>[root@localhost ~]# find /sys/devices/ -name “eth<em>“<br>/sys/devices/pci0000:00/0000:00:02.2/0000:02:00.0/net/eth4<br>/sys/devices/pci0000:00/0000:00:02.2/0000:02:00.1/net/eth5<br>/sys/devices/pci0000:00/0000:00:03.0/0000:04:00.0/net/eth0<br>/sys/devices/pci0000:00/0000:00:03.0/0000:04:00.1/net/eth1<br>/sys/devices/pci0000:00/0000:00:1c.0/0000:07:00.0/net/eth2<br>/sys/devices/pci0000:00/0000:00:1c.0/0000:07:00.1/net/eth3<br>[root@localhost ~]# find /sys/class/ -name “eth</em>“<br>/sys/class/net/eth4<br>/sys/class/net/eth5<br>/sys/class/net/eth0<br>/sys/class/net/eth1<br>/sys/class/net/eth2<br>/sys/class/net/eth3<br>其中/sys/class/net/ethX都是软链接到/sys/device中</li>
<li><a href="http://blog.jobbole.com/83595/" target="_blank" rel="external">代码审查清单</a><ul>
<li>常规项<ul>
<li>代码能够工作么？它有没有实现预期的功能，逻辑是否正确等。</li>
<li>所有的代码是否简单易懂？</li>
<li>代码符合你所遵循的编程规范么？这通常包括大括号的位置，变量名和函数名，行的长度，缩进，格式和注释。</li>
<li>是否存在多余的或是重复的代码？</li>
<li>代码是否尽可能的模块化了？</li>
<li>是否有可以被替换的全局变量？</li>
<li>是否有被注释掉的代码？</li>
<li>循环是否设置了长度和正确的终止条件？</li>
<li>是否有可以被库函数替代的代码？</li>
<li>是否有可以删除的日志或调试代码？</li>
</ul>
</li>
<li>安全<ul>
<li>所有的数据输入是否都进行了检查（检测正确的类型，长度，格式和范围）并且进行了编码？</li>
<li>在哪里使用了第三方工具，返回的错误是否被捕获？</li>
<li>输出的值是否进行了检查并且编码？</li>
<li>无效的参数值是否能够处理？</li>
</ul>
</li>
<li>文档<ul>
<li>是否有注释，并且描述了代码的意图？</li>
<li>所有的函数都有注释吗？</li>
<li>对非常规行为和边界情况处理是否有描述？</li>
<li>第三方库的使用和函数是否有文档？</li>
<li>数据结构和计量单位是否进行了解释？</li>
<li>是否有未完成的代码？如果是的话，是不是应该移除，或者用合适的标记进行标记比如‘TODO’？</li>
</ul>
</li>
<li>测试<ul>
<li>代码是否可以测试？比如，不要添加太多的或是隐藏的依赖关系，不能够初始化对象，测试框架可以使用方法等。</li>
<li>是否存在测试，它们是否可以被理解？比如，至少达到你满意的代码覆盖(code coverage)。</li>
<li>单元测试是否真正的测试了代码是否可以完成预期的功能？</li>
<li>是否检查了数组的“越界“错误？</li>
<li>是否有可以被已经存在的API所替代的测试代码？</li>
</ul>
</li>
</ul>
</li>
</ul>
<h4 id="2015-02-05"><a href="#2015-02-05" class="headerlink" title="2015-02-05"></a>2015-02-05</h4><ul>
<li>开机只启动一个网口网络的脚本,路径为: /etc/rc.d/init.d/network<br>rc_prev=$rc<br>action$”Bringing up interface$i:”  ./ifup$i  boot<br>rc=$((rc+$?))<br>rc_cur=$rc<br>if[  $rc_cur  -eq  $rc_prev  ];then  <pre><code>action$&quot;Only start one ethernet, 2015-02-04&quot;  
break  
</code></pre>fi  </li>
<li>dns功能， 使用dns_conf操作<ul>
<li>相关命令<ul>
<li>dns_conf -a 202.96.134.133  增加域名地址</li>
<li>dns_conf -d 202.96.134.133  增加域名地址</li>
<li>dns_conf -l  罗列系统域名配置</li>
<li>dns_conf -s 3 202.96.134.133 202.96.134.134 202.96.134.135  增加多个域名地址</li>
<li>dns_conf -c  清理dns配置</li>
</ul>
</li>
<li>涉及代码文件sys_mngt.c</li>
<li>涉及系统配置文件/etc/resolv.conf, 其实就是对该配置文件执行读写操作</li>
</ul>
</li>
<li>获取Linux的MAC地址 <ul>
<li>cat /sys/class/net/eth0/address</li>
<li>ip -o link show eth0 |awk ‘{ print toupper(gensub(/.<em>link\/[^ ]</em> ([[:alnum:]:]<em>).</em>/,”\1”, 1)); }’</li>
<li>from /etc/sysconfig/network-scripts/network-functions</li>
</ul>
</li>
<li>修改Linux的MAC地址 <ul>
<li>方法一 <ul>
<li>ifconfig eth0 down</li>
<li>ifconfig eth0 hw ether MAC地址</li>
<li>ifconfig eth0 up</li>
<li>上面命令加入/etc/rc.local </li>
</ul>
</li>
<li>方法二<ul>
<li>./etc/sysconfig/network-scripts/ifcfg-eth0中加入下面一句话： MACADDR=00:AA:BB:CC:DD:EE</li>
</ul>
</li>
<li><a href="http://linuxguest.blog.51cto.com/195664/676152" target="_blank" rel="external">http://linuxguest.blog.51cto.com/195664/676152</a></li>
<li><a href="http://linux-wiki.cn/wiki/zh-hans/Linux更改网卡物理地址(Mac_Address)" target="_blank" rel="external">http://linux-wiki.cn/wiki/zh-hans/Linux更改网卡物理地址(Mac_Address)</a></li>
</ul>
</li>
</ul>
<h4 id="2015-02-04"><a href="#2015-02-04" class="headerlink" title="2015-02-04"></a>2015-02-04</h4><ul>
<li>LIO:<ul>
<li>要罗列iscsi卷, 不能使用cache的方式， 在lvm.c中的get_all_lv函数中直接调用get_all_lv_nocache()即可.</li>
<li>要先在targetcli中删除存储设备，才能删除对应的逻辑卷</li>
<li>targetcli /backstores/block detele dg2lv1 </li>
<li>lvremove –force /dev/dg2/lv1</li>
<li>所以ucli中删除iscsi卷的顺序要调换一下</li>
</ul>
</li>
<li><a href="http://www.cnblogs.com/bangerlee/archive/2012/06/04/2532674.html" target="_blank" rel="external">一次Linux服务器被hack的过程分析</a><ul>
<li><a href="http://www.iuvotech.com/analysis-of-a-hack/" target="_blank" rel="external">http://www.iuvotech.com/analysis-of-a-hack/</a></li>
<li><a href="http://www.iuvotech.com/analysis-of-a-hack-part-2/" target="_blank" rel="external">http://www.iuvotech.com/analysis-of-a-hack-part-2/</a></li>
</ul>
</li>
<li><a href="http://blog.chinaunix.net/uid-20528014-id-4142331.html" target="_blank" rel="external">linux ps 使用技巧</a></li>
<li>linux 启动过程分析<ul>
<li><a href="http://chrinux.blog.51cto.com/6466723/1192004" target="_blank" rel="external">详解linux系统的启动过程及系统初始化</a></li>
<li><a href="http://molinux.blog.51cto.com/2536040/478704" target="_blank" rel="external">linux 启动过程分析</a></li>
<li><a href="http://www.ruanyifeng.com/blog/2013/08/linux_boot_process.html" target="_blank" rel="external">Linux 的启动流程</a></li>
</ul>
</li>
<li>rc0-rc6目录下脚本：<br>K<em>     ##只要是以K开头的文件均执行stop工作<br>S</em>     ##只要是以S开头的文件均执行start工作<br>0-99  (执行次序，数字越小越先被执行)<br>用户自定义开机启动程序(/etc/rc.d/rc.local)<br>可以根据自己的需求将一些执行命令或是脚本写到/etc/rc.d/rc.local里，当开机时，就可以加载啦 </li>
<li>[root@localhost ~]# runlevel<br>N 3<br>[root@localhost ~]# ls /etc/rc3.d/*network<br>/etc/rc3.d/S10network  </li>
<li>这里<a href="https://www.centos.org/forums/viewtopic.php?t=26389" target="_blank" rel="external">https://www.centos.org/forums/viewtopic.php?t=26389</a>说ifcfg-eth0.bak是由<br>kudzu[i.e. /etc/init.d/kudzu, from /etc/rc3.d/S05kudzu or /etc/rc5.d/S05kudzu]<br>侦测到MAC地址改变了产生的。</li>
<li>根据启动时出现的字符:<ul>
<li>Bringing up loopback interface:   [ OK ]</li>
<li>Bringing up interface eth2 :      [ OK ]</li>
<li>Bringing up interface eth3 :      这里停止不动 </li>
<li>使用命令查询<code>grep -rl &quot;Bringing up interface&quot; /etc/</code>, </li>
<li>网络的启动脚本都是软链接，指向/etc/init.d/network</li>
<li>[root@localhost ~]# grep -rn “Bringing up loopback interface” /etc/init.d/network<br>68:  action $”Bringing up loopback interface: “ ./ifup ifcfg-lo</li>
<li>[root@localhost ~]# grep -rn “Bringing up interface” /etc/init.d/network<br>142:  action $”Bringing up interface $i: “ ./ifup $i boot<br>154:  action $”Bringing up interface $i: “ ./ifup $i boot</li>
<li>实际是执行命令<code>/etc/sysconfig/network-scripts/ifup eth3 boot</code></li>
</ul>
</li>
</ul>
<h4 id="2015-02-03"><a href="#2015-02-03" class="headerlink" title="2015-02-03"></a>2015-02-03</h4><ul>
<li><a href="http://developer.qiniu.com/" target="_blank" rel="external">七牛云存储使用指南-开发者中心</a>, 可以参考学习如何做SDK，<br>支持各种语言的API接口设计</li>
<li><a href="http://blog.c1gstudio.com/archives/1703" target="_blank" rel="external">centos固定多网卡启动顺序</a>, CentOS 5.8<ul>
<li>dmesg中看到intel的pci网卡先于内置网卡 </li>
<li>cat /etc/udev/rules.d/60-net.rules <ul>
<li>ACTION==”add”, SUBSYSTEM==”net”, IMPORT{program}=”/lib/udev/rename_device”</li>
<li>SUBSYSTEM==”net”, RUN+=”/etc/sysconfig/network-scripts/net.hotplug”</li>
</ul>
</li>
<li>查看driver和bus-info, 使用 <code>ethtool -i ethX</code></li>
<li>编辑顺序<ul>
<li>DRIVER指driver: e1000e</li>
<li>ID是指bus-info:PCI ID</li>
</ul>
</li>
<li>vi /etc/udev/rules.d/60-net.rules<ul>
<li>DRIVER==”bnx2”,ID==”0000:01:00.0”,NAME=”eth0”</li>
<li>DRIVER==”bnx2”,ID==”0000:01:00.1”,NAME=”eth1”</li>
<li>DRIVER==”e1000e”,ID==”0000:03:00.0”,NAME=”eth2”</li>
<li>DRIVER==”e1000e”,ID==”0000:03:00.1”,NAME=”eth3</li>
</ul>
</li>
<li>reboot</li>
<li>查看message确认启动顺序</li>
</ul>
</li>
<li>或者直接在现场的机器解开Linux-2.6.37.6源代码，下载最新的igb驱动源代码过去直接编译<br>如果编译成功，就直接替换，重启看是否问题解决。</li>
<li>/boot/下面有一个config文件，如:config-2.6.18-308.el5, 可以考虑将config-2.6.37-6.el5<br>拷贝到我们下载的linux-2.6.37.6目录中重新编译。</li>
<li>从新编译的内核启动，无法正常启动系统。</li>
<li>kernel: linux-2.6.37.6, directory: drivers/net/igb/, file: igb_main.c<br><code>define DRV_VERSION &quot;2.1.0-k2&quot;</code><br><code>char igb_driver_name[] = &quot;igb&quot;;</code><br><code>char igb_driver_version[] = DRV_VERSION;</code>  </li>
<li>cat /boot/grub/grub.conf<br>default=1<br>timeout=5<br>splashimage=(hd0,0)/grub/splash.xpm.gz<br>hiddenmenu<br>title CentOS (2.6.37.6)  <pre><code>root (hd0,0)  
kernel /vmlinuz-2.6.37.6 ro root=/dev/VolGroup00/LogVol00  
initrd /initrd-2.6.37.6.img  
</code></pre>title CentOS (2.6.18-308.el5)  <pre><code>root (hd0,0)  
kernel /vmlinuz-2.6.18-308.el5 ro root=/dev/VolGroup00/LogVol00  
initrd /initrd-2.6.18-308.el5.img  
</code></pre></li>
<li>[root@localhost linux-2.6.37.6]# ethtool -i eth0<br>driver: igb<br>version: 3.0.6-k2-2<br>firmware-version: 1.5-2<br>bus-info: 0000:06:00.0<br>[root@localhost linux-2.6.37.6]# uname -r<br>2.6.18-308.el5  </li>
<li>[root@localhost linux-2.6.37.6]# make install<br>sh /usr/src/kernels/linux-2.6.37.6/arch/x86/boot/install.sh 2.6.37.6 arch/x86/boot/bzImage \  <pre><code>System.map &quot;/boot&quot;  
</code></pre>WARNING: No module ehci-hcd found for kernel 2.6.37.6, continuing anyway<br>WARNING: No module ohci-hcd found for kernel 2.6.37.6, continuing anyway<br>WARNING: No module uhci-hcd found for kernel 2.6.37.6, continuing anyway<br>WARNING: No module ahci found for kernel 2.6.37.6, continuing anyway<br>WARNING: No module isci found for kernel 2.6.37.6, continuing anyway<br>WARNING: No module ahci found for kernel 2.6.37.6, continuing anyway<br>WARNING: No module ehci-hcd found for kernel 2.6.37.6, continuing anyway<br>WARNING: No module ohci-hcd found for kernel 2.6.37.6, continuing anyway<br>WARNING: No module uhci-hcd found for kernel 2.6.37.6, continuing anyway<br>WARNING: No module usb-storage found for kernel 2.6.37.6, continuing anyway  </li>
<li>[root@localhost linux-2.6.37.6]# make modules_install<br>INSTALL arch/x86/kernel/test_nx.ko<br>INSTALL drivers/scsi/scsi_wait_scan.ko<br>INSTALL net/netfilter/xt_mark.ko<br>DEPMOD  2.6.37.6<br>只是装了3个ko，是不是配置的时候没有选择好?</li>
<li>编译升级kernel前 [root@localhost linux-2.6.37.6]# ls /boot/<ul>
<li>config-2.6.18-308.el5  </li>
<li>initrd-2.6.18-308.el5.img  </li>
<li>message     </li>
<li>System.map-2.6.18-308.el5</li>
<li>grub      </li>
<li>lost+found  </li>
<li>symvers-2.6.18-308.el5.gz  </li>
<li>vmlinuz-2.6.18-308.el5</li>
</ul>
</li>
<li>编译升级kernel后 [root@localhost linux-2.6.37.6]# ls /boot/<ul>
<li>config-2.6.18-308.el5   </li>
<li>initrd-2.6.37.6.img</li>
<li>symvers-2.6.18-308.el5.gz  </li>
<li>System.map-2.6.37.6   </li>
<li>vmlinuz-2.6.37.6</li>
<li>grub </li>
<li>lost+found</li>
<li>System.map</li>
<li>vmlinuz</li>
<li>initrd-2.6.18-308.el5.img  </li>
<li>message</li>
<li>System.map-2.6.18-308.el5  </li>
<li>vmlinuz-2.6.18-308.el5</li>
</ul>
</li>
<li>[root@localhost linux-2.6.37.6]# md5sum /usr/src/kernels/linux-2.6.37.6/arch/x86/boot/bzImage<br> /boot/vmlinuz-2.6.37.6 <ul>
<li>82265730205fda20e75ea9f0be69f10b  /usr/src/kernels/linux-2.6.37.6/arch/x86/boot/bzImage</li>
<li>82265730205fda20e75ea9f0be69f10b  /boot/vmlinuz-2.6.37.6</li>
</ul>
</li>
<li>[root@localhost linux-2.6.37.6]# make install<br>sh /usr/src/kernels/linux-2.6.37.6/arch/x86/boot/install.sh 2.6.37.6 arch/x86/boot/bzImage \<br>System.map “/boot”  <ul>
<li>参数<ul>
<li>$1 - kernel version</li>
<li>$2 - kernel image file</li>
<li>$3 - kernel map file</li>
<li>$4 - default install path (blank if root directory)</li>
</ul>
</li>
<li>脚本解析<ul>
<li>cat $2 &gt; $4/vmlinuz  释放image文件到安装目录的vmlinuz</li>
<li>cp $3 $4/System.map  拷贝map文件到安装目录的System.map</li>
</ul>
</li>
</ul>
</li>
<li>CentOS发行版本的内核源代码下载地址 <a href="http://vault.centos.org" target="_blank" rel="external">http://vault.centos.org</a>, 但是无法找到2.6.37内核的.<br>google 搜索 <code>2.6.37 site:http://vault.centos.org</code>, 找不到。<ul>
<li><a href="http://wiki.centos.org/zh/HowTos/I_need_the_Kernel_Source" target="_blank" rel="external">http://wiki.centos.org/zh/HowTos/I_need_the_Kernel_Source</a></li>
<li><a href="http://blog.csdn.net/trochiluses/article/details/17059471" target="_blank" rel="external">http://blog.csdn.net/trochiluses/article/details/17059471</a></li>
<li><a href="http://www.cnblogs.com/feisky/archive/2011/11/12/2246639.html" target="_blank" rel="external">http://www.cnblogs.com/feisky/archive/2011/11/12/2246639.html</a></li>
</ul>
</li>
<li>编译升级Linux kernel<ul>
<li>tar xvf linux-2.6.37.6.tar.gz</li>
<li>cd linux-2.6.37.6</li>
<li>make defconfig  产生默认的config文件</li>
<li>yum install ncurses-devel </li>
<li>make menuconfig 菜单式配的config<ul>
<li>y 直接构建为静态模块，n 完全不构建，m 构建到内核中，成为动态模块</li>
</ul>
</li>
<li>make -j8        编译内核</li>
<li>make modules    编译模块</li>
<li>make modules_install  安装模块</li>
<li>make install    安装内核</li>
<li><a href="http://my.oschina.net/guol/blog/115913" target="_blank" rel="external">Linux 内核手动编译升级</a></li>
<li><a href="http://300second.blog.51cto.com/7582/816758" target="_blank" rel="external">http://300second.blog.51cto.com/7582/816758</a></li>
<li><a href="http://seanlook.com/2014/10/24/upgrade-centos6_kernel-to-3.10.x/" target="_blank" rel="external">http://seanlook.com/2014/10/24/upgrade-centos6_kernel-to-3.10.x/</a></li>
<li><a href="http://www.kroah.com/lkn/" target="_blank" rel="external">http://www.kroah.com/lkn/</a></li>
<li><a href="http://www.lenky.info/archives/2012/05/1688" target="_blank" rel="external">http://www.lenky.info/archives/2012/05/1688</a></li>
</ul>
</li>
</ul>
<h4 id="2015-02-02"><a href="#2015-02-02" class="headerlink" title="2015-02-02"></a>2015-02-02</h4><ul>
<li>SFML: Simple and Fast Multimedia Library <a href="http://www.sfml-dev.org" target="_blank" rel="external">http://www.sfml-dev.org</a><ul>
<li>yum install SFML-devel</li>
</ul>
</li>
<li>★★★重新学习C/C++<ul>
<li>希望能用C++完成下面的所有项目 <a href="https://github.com/karan/Projects" target="_blank" rel="external">https://github.com/karan/Projects</a></li>
<li>Numbers</li>
<li>Classic Algorithms</li>
<li>Graph</li>
<li>Data Structures</li>
<li>Text</li>
<li>Networking</li>
<li>Classes</li>
<li>Threading</li>
<li>Web</li>
<li>Files</li>
<li>Databases</li>
<li>Graphics and Multimedia</li>
<li>Security</li>
<li>这个页面 <a href="https://github.com/karan/Projects-Solutions" target="_blank" rel="external">https://github.com/karan/Projects-Solutions</a> 有一些参考</li>
</ul>
</li>
<li>何为浪费时间<ul>
<li>就是本来可以直接解决的问题，非要绕着去解决。这个情况下，虽然你工作了半年，<br>可能你知识的积累增长只有三四周。OMG。</li>
</ul>
</li>
<li>如果你需要编译一个内核的驱动程序（模块），很可能你并不需要安装整个内核源代码。<br>也许你只需要安装 kernel-devel 这个组件。<ul>
<li><a href="http://wiki.centos.org/zh/HowTos/I_need_the_Kernel_Source" target="_blank" rel="external">http://wiki.centos.org/zh/HowTos/I_need_the_Kernel_Source</a></li>
</ul>
</li>
<li>kernel devel与kernel source的区别<ul>
<li>kernel-devel包只包含用于内核开发环境所需的内核头文件以及Makefile，而kernel-souce包含所有内核源代码</li>
</ul>
</li>
<li>CentOS 内核升级网络无法链接问题<ul>
<li>预安装内核版本:2.6.18-308.el5.x86_64</li>
<li>内核升级后版本:2.6.37-6.el5.x86_64</li>
<li>查看 <a href="http://download.appexnetworks.com/ls.do?m=availables" target="_blank" rel="external">http://download.appexnetworks.com/ls.do?m=availables</a>，2.6.37对应的CentOS5.4</li>
<li>升级前网卡驱动igb, 3.0.6, 升级后, 2.0.1，</li>
<li>问题应该就出在网卡驱动上，下载个新版的驱动, 在2.6.37-6下重新编译应该没有问题</li>
<li>现在的问题是去哪下载2.6.37-6.e15.x86_64的内核树</li>
<li><a href="https://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.37.6.tar.gz" target="_blank" rel="external">https://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.37.6.tar.gz</a></li>
<li><a href="http://vault.centos.org/" target="_blank" rel="external">http://vault.centos.org/</a></li>
</ul>
</li>
<li>嵌入式实时OS测试工程师<ul>
<li>职位名称：Linux高级测试工程师</li>
<li>岗位职责：独立承担OS子系统的测试工作。</li>
<li>岗位要求:<ul>
<li>1、博士1年以上，硕士4年以上，本科5年以上，有测试框架、测试工具开发经验；</li>
<li>2、从事Linux、嵌入式开发、以及各类芯片、驱动测试验证者优先； 主持过大型<br>   软件测试工作，有成功的测试方案、自动化框架输出者优先； 从事大型软件的<br>   可靠性、性能等专项测试工作者优先；</li>
<li>3、可以熟练使用一种或多种编程语言，例如 C/C++等，对shell、python等脚本语言了解者优先。 </li>
</ul>
</li>
</ul>
</li>
<li><a href="http://blog.itpub.net/27771627/viewspace-1256552" target="_blank" rel="external">linux 内核升级步骤，kernel升级</a></li>
<li><a href="http://www.programmer.com.cn/7624/" target="_blank" rel="external">Big Data技术综述</a></li>
<li><a href="http://blog.jobbole.com/54425/" target="_blank" rel="external">每个Linux用户都应该知道的命令行技巧</a></li>
<li><a href="http://blog.jobbole.com/55086/" target="_blank" rel="external">十步完全理解SQL</a></li>
<li><a href="http://blog.jobbole.com/82633/" target="_blank" rel="external">有哪些实用的计算机相关技能，可以在一天内学会？</a><ul>
<li>7.做一个爬虫，可以抓取一些网页并能解析一些基本数据 </li>
<li>38.学习设计模式 《23个设计模式的简明教程》</li>
</ul>
</li>
<li><a href="http://www.cnblogs.com/marvin/p/HowCanIHandleBigDataBySQLServer.html" target="_blank" rel="external">我是如何在SQLServer中处理每天四亿三千万记录的</a></li>
<li>数据库<ul>
<li>传统数据库: 磁盘数据库, DRDB: Disk-Resident Database </li>
<li>内存数据库: 主存数据库, MMDB:Main Memory Database</li>
</ul>
</li>
<li>内存数据库的目标是通过使用内存实现数据存储来提高吞吐量和降低延迟。这与使用磁<br>盘存储的传统数据库管理系统不同。由于内部优化算法更简单，而且执行的CPU指令较少，<br>所以内存内数据的速度比基于磁盘的数据库快。访问内存数据可以提高响应速度。 Mich Talebzadeh <ul>
<li><a href="http://docs.huihoo.com/techtarget/searchdatabase/imdb.pdf" target="_blank" rel="external">主流内存数据库指南 pdf</a></li>
<li><a href="http://blog.jobbole.com/1344/" target="_blank" rel="external">8种Nosql数据库系统对比</a></li>
<li>内存数据库中的索引技术:T树、基于缓存敏感(cacheconscious)的CSS/CSB+树，Trie-tree和Hash<ul>
<li><a href="http://blog.csdn.net/zhujunxxxxx/article/details/42490335" target="_blank" rel="external">http://blog.csdn.net/zhujunxxxxx/article/details/42490335</a></li>
</ul>
</li>
</ul>
</li>
</ul>
<h4 id="2015-01-31"><a href="#2015-01-31" class="headerlink" title="2015-01-31"></a>2015-01-31</h4><ul>
<li>关于出现ifcfg-ethX.bak<ul>
<li><a href="http://blog.chinaunix.net/uid-1869-id-3358438.html" target="_blank" rel="external">删除linux系统中eth0.bak与多余的网卡方法</a></li>
<li>Linux系統中若更改了網卡MAC地址或者更換了網卡，同種配置機器更換了硬盤，都會出現一個.bak的網卡配置文件的備份 </li>
<li><a href="http://fanli7.net/a/caozuoxitong/OS/20131015/433191.html" target="_blank" rel="external">http://fanli7.net/a/caozuoxitong/OS/20131015/433191.html</a></li>
</ul>
</li>
<li><a href="http://unix.stackexchange.com/questions/75427/rhel-creating-stable-names-for-network-interfaces" target="_blank" rel="external">CentOS 5.X, 6.X rule规则改变</a><ul>
<li>CentOS 5.x, <code>/etc/udev/rules.d/60-net.rules</code></li>
<li>CentOS 5.x, <code>KERNEL==&quot;eth*&quot;, SYSFS{address}==&quot;00:30:48:56:A6:2E&quot;, NAME=&quot;eth0&quot;</code></li>
<li>CentOS 6.x, <code>/etc/udev/rules.d/70-persistent-net.rules</code></li>
<li>CentOS 6.x, <code>SUBSYSTEM==&quot;net&quot;, ACTION==&quot;add&quot;, DRIVERS==&quot;?*&quot;, ATTR{address}==&quot;54:52:00:ff:ff:dd&quot;, ATTR{type}==&quot;1&quot;, KERNEL==&quot;eth*&quot;, NAME=&quot;eth0&quot;</code></li>
<li><a href="http://www.pwrusr.com/tag/eth0eth0rm-etcudevrules-d70-persistent-net-rules" target="_blank" rel="external">http://www.pwrusr.com/tag/eth0eth0rm-etcudevrules-d70-persistent-net-rules</a></li>
</ul>
</li>
<li><a href="http://www.linuxidc.com/Linux/2015-01/112329.htm" target="_blank" rel="external">cv：显示Linux命令运行进度的命令</a></li>
<li>一件有点愚蠢的事情: 打开了/etc/udev/udev.conf中的debug模式，导致开机时一直打开udev调试消息,<br>无法进入操作系统。使用单用户模式也无法阻止该调试消息. 应该修改为udev_log=”info”就好了的。<br>目前的想法是，搞个u盘的live系统，直接修改硬盘的信息.</li>
<li>ustor 系统日志位置: <ul>
<li>/etc/cf/log/message</li>
<li>/etc/cf/log/sys/XXX.tar.gz</li>
</ul>
</li>
<li>mount -o loop XXX.iso /mnt</li>
<li>普通用户使用wireshark抓包<ul>
<li>groupadd wireshark 增加组</li>
<li>usermod -a -G wireshark dennis 把当前用户加入wireshark组</li>
<li>chgrp wireshark /usr/sbin/dumpcap 修改权限</li>
<li>grep wireshark /etc/group 确认用户在wireshark组中</li>
<li>logout or reboot, try</li>
</ul>
</li>
<li>关于NAS和SAN，这个文章解释的很好, <a href="http://benjr.tw/286" target="_blank" rel="external">http://benjr.tw/286</a><ul>
<li>DAS :  Application –&gt; File system –&gt; Disk Storage<ul>
<li>就是常用的直接存储，就是硬盘直接挂载到系统上</li>
</ul>
</li>
<li>NAS :  Application –&gt; Networking –&gt; File system –&gt; Disk Storage<ul>
<li>NFS, 供Linux客户端访问的网络文件系统</li>
<li>SAMBA/CIFS, 供Windows客户端访问的网络文件系统</li>
</ul>
</li>
<li>SAN :  Application –&gt; File system –&gt; Networking –&gt; Disk Storage<ul>
<li>IP-SAN: iSCSI, 在客户端应用程序访问前，需要先格式化成指定格式的文件系统.</li>
</ul>
</li>
</ul>
</li>
<li>蓝汛项目:在安装好的Centos5.8上，打上蓝汛自己的内核后，服务器的网卡识别次序发生混乱，<br>造成服务器无法访问。可能原因分析:  <ul>
<li>之前出现过，安装好的系统，突然更换主板后无法在页面设置IP，原因是系统启动时候调用<br>udev来配置网络，原来的配置中存有规则，就是哪个mac地址对应哪个ethX名，通常来说，<br>第一次装的系统的eth名会是eth0和eth1(针对双网口), 现在换了新主板，mac地址就变了。<br>那么udev会发现eth0和eth1已经和其他mac地址绑定，所以现在只会分配eth3,eth4…  <ul>
<li><a href="/2014/12/08/how-to-fix-nic-name-confusion/">how-to-fix-nic-name-confusion</a></li>
</ul>
</li>
<li>但这里出现的问题过程不是更换主板，而是替换内核</li>
<li>CENTOS 5.8 对应内核版本 2.6.18-308, 参考 <a href="http://blog.csdn.net/zhongyhc/article/details/39205925" target="_blank" rel="external">http://blog.csdn.net/zhongyhc/article/details/39205925</a></li>
<li>更换内核方法，参考 <a href="http://os.51cto.com/art/201101/242682.htm" target="_blank" rel="external">http://os.51cto.com/art/201101/242682.htm</a></li>
<li>关于Linux固定eth顺序，参考<ul>
<li><a href="http://blog.c1gstudio.com/archives/1703" target="_blank" rel="external">centos固定多网卡启动顺序</a></li>
<li><a href="http://benjr.tw/10632" target="_blank" rel="external">Linux – udev</a></li>
<li><a href="http://benjr.tw/10626" target="_blank" rel="external">Linux – udev 網絡介面卡的順序</a></li>
</ul>
</li>
<li>所有这些都是只是预先的学习和参考，没有案发现场，将无法作出准确的判断。话虽如此，<br>目前猜测，应该是跟udev有关, 因为eth顺序是由它来控制的。</li>
</ul>
</li>
</ul>
<h4 id="2015-01-30"><a href="#2015-01-30" class="headerlink" title="2015-01-30"></a>2015-01-30</h4><ul>
<li><a href="http://blog.csdn.net/sduliulun/article/details/7732906" target="_blank" rel="external">valgrind 使用</a><ul>
<li>yum install valgrind</li>
<li>编译程序: <code>test.c gcc -Wall test.c -g -o test</code></li>
<li>使用Valgrind检查程序BUG: <code>valgrind --tool=memcheck --leak-check=full ./test</code></li>
<li>常见问题:<ul>
<li>使用未初始化内存问题</li>
<li>内存读写越界</li>
<li>内存覆盖: strcpy, strncpy, memcpy, strcat 等，这些函数有一个共同的特点就是<br>需要设置源地址 (src)，和目标地址(dst)，src 和 dst 指向的地址不能发生重叠，否则结果将不可预期 </li>
<li>动态内存管理错误. free要对应malloc，delete要对应new</li>
<li>内存泄漏</li>
</ul>
</li>
<li>原始链接: <a href="http://bbs.ednchina.com/BLOG_ARTICLE_1772918.HTM" target="_blank" rel="external">http://bbs.ednchina.com/BLOG_ARTICLE_1772918.HTM</a></li>
</ul>
</li>
<li><a href="http://blog.csdn.net/chen19870707/article/details/43202679" target="_blank" rel="external">为什么linux下多线程程序如此消耗虚拟内存 </a><ul>
<li>valgrind –leak-check=full –track-fds=yes –log-file=./AuthServer.vlog  RUN_YOUR_PROGRAM &amp; </li>
<li>strace -f -e”brk,mmap,munmap” -p $(pidof AuthServer)</li>
<li>查看和设置线程堆栈大小可用ulimit –s</li>
<li>pmap $(pidof main) </li>
</ul>
</li>
</ul>
<h4 id="2015-01-29"><a href="#2015-01-29" class="headerlink" title="2015-01-29"></a>2015-01-29</h4><ul>
<li>shell 获取当前的时间戳<ul>
<li>date ‘+%s’  获取当前的时间戳</li>
<li>date -d ‘1970-01-01 UTC 946684800 seconds’ +”%Y-%m-%d %T %z”  将时间戳转成日期</li>
<li>date -d “-30 minute” +%Y%m%d:%H:%M    30分钟前</li>
<li>da=$(date -d “yesterday” +”%Y-%m-%d”)</li>
<li><a href="http://kure6.blog.51cto.com/2398286/864929" target="_blank" rel="external">http://kure6.blog.51cto.com/2398286/864929</a></li>
</ul>
</li>
<li>BIT Coin <a href="https://blockchain.info/zh-cn/" target="_blank" rel="external">https://blockchain.info/zh-cn/</a></li>
<li>LIO<ul>
<li>./lio -A -o iscsi -d dg2 -v lv1 </li>
<li>./lio -D -o iscsi -d dg2 -v lv1 </li>
<li>./lio -A -o auth -d dg2 -v lv1 -u dennis -p 123456</li>
<li>./lio -D -o auth -d dg2 -v lv1 -u dennis -p 123456</li>
<li>./lio -L -o auth -d dg2 -v lv1</li>
</ul>
</li>
<li>lv content was put on /dev/shm/lvs.conf </li>
<li>Steps for create logic volume:<ul>
<li>if dg not exist, do:<ul>
<li>pvcreate –metadatasize 4M -ff -y /dev/md0 -M 2</li>
<li>rm -f /dev/dg2</li>
<li>vgcreate -s 2M dg2 /dev/md0</li>
</ul>
</li>
<li>lvcreate -p rw -L 10240M -n lv1 dg2 –alias rw –xtype iscsi –addtag @%d</li>
</ul>
</li>
</ul>
<h4 id="2015-01-28"><a href="#2015-01-28" class="headerlink" title="2015-01-28"></a>2015-01-28</h4><ul>
<li>LIO<ul>
<li>implement chap deletion</li>
<li>get acl info</li>
</ul>
</li>
<li><a href="http://www.ha97.com/5114.html" target="_blank" rel="external">OpenSSL加密解密文件</a><ul>
<li>1、使用aes-128-cbc算法加密文件： <ul>
<li>openssl enc -aes-128-cbc -in install.log -out enc.log<br>（注：这里install.log是你想要加密的文件，enc.log是加密后的文件，回车后系统会提示你输入密码。）</li>
</ul>
</li>
<li>2、解密刚才加密的文件： <ul>
<li>openssl enc -d -aes-128-cbc -in enc.log -out install.log<br>（注：enc.log是刚才加密的文件，install.log是解密后的文件，-d选项实现解密功能。）</li>
</ul>
</li>
<li>3、加密文件后使用BASE64格式进行编码： <ul>
<li>openssl enc -aes-128-cbc -in install.log -out enc.log -a</li>
</ul>
</li>
<li>4、使用多种口令输入方式加密： <ul>
<li>openssl enc -des-ede3-cbc -in install.log -out enc.log -pass pass:111111</li>
</ul>
</li>
</ul>
</li>
<li><a href="http://www.ha97.com/5114.html" target="_blank" rel="external">使用tar与OpenSSL加密解密打包文件</a><ul>
<li>pma目录的文件夹<ul>
<li>对文件压缩加密：<code># tar -zcvf - pma|openssl des3 -salt -k password | dd of=pma.des3</code></li>
<li>对加密文件解压：<code># dd if=pma.des3 |openssl des3 -d -k password|tar zxf -</code></li>
</ul>
</li>
</ul>
</li>
<li><a href="http://www.ha97.com/5186.html" target="_blank" rel="external">Linux下的暴力密码在线破解工具Hydra详解</a></li>
<li>Hacking<ul>
<li><a href="http://www.wikihow.com/Hack" target="_blank" rel="external">How to hack</a><ul>
<li>Use a *nix terminal for commands</li>
<li>Secure your machine first</li>
<li>Test the target, ping</li>
<li>Determine the operation system(OS), port scan(nmap or pof)</li>
<li>Find a path or open port in the system</li>
<li>Crack the password or authentication process</li>
<li>Get super-user privileges</li>
<li>Using various tricks</li>
<li>Create a backdoor</li>
<li>Cover your tracks</li>
</ul>
</li>
<li><a href="http://www.xmarks.com/topic/hacking_forums" target="_blank" rel="external">Top Sites about:  Hacking Forums</a></li>
<li><a href="http://blog.codinghorror.com/rainbow-hash-cracking/" target="_blank" rel="external">Rainbow Hash Cracking</a></li>
<li><a href="http://network.chinabyte.com/120/12286120_3.shtml" target="_blank" rel="external">http://network.chinabyte.com/120/12286120_3.shtml</a></li>
</ul>
</li>
</ul>
<h4 id="2015-01-27"><a href="#2015-01-27" class="headerlink" title="2015-01-27"></a>2015-01-27</h4><ul>
<li>合理的iqn “iqn.yyyy-mm.<reversed domain="" name="">: identifier 识别代号”</reversed></li>
<li>network programme <ul>
<li><a href="http://repo.hackerzvoice.net/depot_ouah/programmes.html" target="_blank" rel="external">http://repo.hackerzvoice.net/depot_ouah/programmes.html</a></li>
<li><a href="https://github.com/mozilla-b2g/busybox/tree/master/networking" target="_blank" rel="external">https://github.com/mozilla-b2g/busybox/tree/master/networking</a></li>
<li><a href="https://www.thc.org/thc-hydra/" target="_blank" rel="external">https://www.thc.org/thc-hydra/</a></li>
<li><a href="https://github.com/vanhauser-thc/thc-hydra" target="_blank" rel="external">https://github.com/vanhauser-thc/thc-hydra</a></li>
</ul>
</li>
<li>LIO, 上周的问题，windows无法访问的问题没有了，变化的是存储机器130.200关机重启了.<ul>
<li>增加访问权限功能</li>
</ul>
</li>
<li>screen<ul>
<li>screen -list</li>
<li>screen -S name</li>
<li>screen -r id/name</li>
<li>ctrl+a d</li>
</ul>
</li>
<li>ucli vd_iscsi –create Fail<ul>
<li>lvs</li>
<li>lvremove /dev/dg2/iscsi01</li>
<li>[root@localhost ucli]# ./ucli vd_iscsi –create -d dg2 -v iscsi01 -s 10240M<br>1139, ietadm –op new –tid=4 –lun=0 –params Path=/dev/dg2/iscsi01,IOMode=wb,Sector=512,Type=blockio<br>fail(target failed to run when created)  </li>
</ul>
</li>
<li>compile IET<ul>
<li>uname -r 检查内核版本</li>
<li>ls /usr/src/kernels/ 查询是否有内核源代码目录</li>
<li>如果没有匹配的那就yum安装, yum install -y kernel-devel</li>
<li><code>[dennis@localhost iscsitarget-code]$ ls /usr/src/kernels/</code><br>3.18.3-201.fc21.x86_64<br>[dennis@localhost iscsitarget-code]$ uname -r<br>3.18.3-201.fc21.x86_64  </li>
<li>[dennis@localhost iscsitarget-code]$ svn info<br>Path: .<br>Working Copy Root Path: /home/dennis/work/svn/iscsitarget-code<br>URL: svn://svn.code.sf.net/p/iscsitarget/code/trunk<br>Relative URL: ^/trunk<br>Repository Root: svn://svn.code.sf.net/p/iscsitarget/code<br>Repository UUID: 48a34bb2-7106-0410-bc49-8aa7273d22a1<br>Revision: 503<br>Node Kind: directory<br>Schedule: normal<br>Last Changed Author: agr1<br>Last Changed Rev: 503<br>Last Changed Date: 2014-06-18 05:16:41 +0800 (Wed, 18 Jun 2014)  </li>
<li>在工作PC(Fedora 21)使用503版本，在3.18.3-201的内核上编译通过.</li>
<li>在目标机器CentOS7.0 编译 503 版本, 编译conn.c时出错<br>[root@localhost iscsitarget-code]# uname -r<br>3.10.0-123.el7.x86_64<br>[root@localhost iscsitarget-code]# ls /usr/src/kernels/<br>3.10.0-123.el7.x86_64<br>[root@localhost iscsitarget-code]# make<br>…<br>/root/iet/iscsitarget-code/kernel/conn.c: In function ‘conn_info_show’:<br>/root/iet/iscsitarget-code/kernel/conn.c:51:19: error: ‘struct ipv6_pinfo’ has no member named ‘daddr’<br>&amp;inet6_sk(sk)-&gt;daddr);<br>…<br>[root@localhost iscsitarget-code]# vim kernel/conn.c  </li>
<li>该错误代码在连接信息显示函数中，可以暂时屏蔽，屏蔽后编译通过.</li>
</ul>
</li>
</ul>
<h4 id="2015-01-26"><a href="#2015-01-26" class="headerlink" title="2015-01-26"></a>2015-01-26</h4><ul>
<li>清理公司工作PC，准备安装Fedora Workstation 21<ul>
<li>使用大半年，有很多不需要的文件需要清理, 需要重新规划系统目录，删除不用保留的文件.</li>
<li>该版本(Fedora 20)使用过程中会出现弹出的窗口变黑的问题</li>
<li>gvim和ibus有冲突，导致使用gvim并且开启ibus中文输入法的时候，键盘按键无效问题</li>
</ul>
</li>
</ul>
<h4 id="2015-01-24"><a href="#2015-01-24" class="headerlink" title="2015-01-24"></a>2015-01-24</h4><ul>
<li>LIO<ul>
<li>linux的initiator连接成功</li>
<li>windows的initiator连接失败<ul>
<li>T端wireshark抓包，发现I端发送Text Command后，相隔了15ms，T端回了[FIN,ACK],<br>正常应该很快就T端回ACK, 然后T端发送Text Response</li>
<li>linux的I端发送的Text Command数据包中有Options段，windwos的没有。</li>
</ul>
</li>
</ul>
</li>
<li>TCP的几个状态 (SYN, FIN, ACK, PSH, RST, URG) <ul>
<li>缩写 <ul>
<li>SYN(synchronous建立联机) </li>
<li>ACK(acknowledgement 确认) </li>
<li>PSH(push传送) </li>
<li>FIN(finish结束) </li>
<li>RST(reset重置) </li>
<li>URG(urgent紧急)</li>
<li>Sequence number(顺序号码) </li>
<li>Acknowledge number(确认号码)</li>
</ul>
</li>
<li>SYN表示建立连接，</li>
<li>FIN表示关闭连接，</li>
<li>ACK表示响应，</li>
<li>PSH表示有DATA数据传输，</li>
<li>RST表示连接重置</li>
<li>URG表示紧急数据</li>
<li><a href="http://rainbow702.iteye.com/blog/2007177" target="_blank" rel="external">http://rainbow702.iteye.com/blog/2007177</a></li>
</ul>
</li>
<li>IET, the latest source code is <a href="http://sourceforge.net/p/iscsitarget/code/HEAD/tree/trunk/" target="_blank" rel="external">here</a><ul>
<li>the current laster svn revision is r503</li>
<li>Fail to compile it on CentOS 7.0.1406, kernel: 3.10.0-123.el7.x86_64. Error message:<br>/iscsitarget-code/kernel/conn.c: In function ‘conn_info_show’:<br>/iscsitarget-code/kernel/conn.c:51:19: error: ‘struct ipv6_pinfo’ has no member named ‘daddr’   </li>
</ul>
</li>
<li>LIO<ul>
<li>Not need to do ip limit for LIO</li>
<li>tcpdump -n -i enp3s0 host 172.16.50.39 and port 3260</li>
</ul>
</li>
<li><a href="http://www.lampnode.com/hosts.html" target="_blank" rel="external">Linux Hosts</a><ul>
<li><a href="http://www.linode.com/" target="_blank" rel="external">Linode</a></li>
<li><a href="http://www.aliyun.com/" target="_blank" rel="external">Aliyun</a></li>
<li><a href="http://www.godaddy.com/" target="_blank" rel="external">Godaddy</a></li>
</ul>
</li>
<li>Auto connect vpn by NetworkManager Command Line(nmcli)<ul>
<li><code>nmcli</code></li>
<li><code>nmcli con help</code></li>
<li><code>nmcli con show</code></li>
<li>vpn configure files was put on /etc/NetworkManager/system-connections/VPN_AM</li>
<li><code>nmcli connection up VPN_AM15</code></li>
<li><code>nmcli con up uuid e923399-0b97-4dbe-8199-434343437b</code></li>
<li>Ref <ul>
<li><a href="http://www.lampnode.com/linux/how-to-auto-connect-to-vpn-on-startup-in-ubuntu-1404/" target="_blank" rel="external">http://www.lampnode.com/linux/how-to-auto-connect-to-vpn-on-startup-in-ubuntu-1404/</a></li>
<li><a href="http://www.lampnode.com/linux/how-to-configure-vpn-on-ubuntu-in-command-line/" target="_blank" rel="external">http://www.lampnode.com/linux/how-to-configure-vpn-on-ubuntu-in-command-line/</a></li>
<li><a href="http://askubuntu.com/questions/43465/how-to-automatically-connect-to-vpn-with-network-manager" target="_blank" rel="external">http://askubuntu.com/questions/43465/how-to-automatically-connect-to-vpn-with-network-manager</a></li>
</ul>
</li>
</ul>
</li>
</ul>
<h4 id="2015-01-23"><a href="#2015-01-23" class="headerlink" title="2015-01-23"></a>2015-01-23</h4><ul>
<li>LIO coding<ul>
<li>grep -rn ‘vd_iscsi ‘ /opt/html/*</li>
<li>For IET, io_mode(wb,wt) was set by command <code>ietadm</code>; how to set io_mode for LIO</li>
<li><code>[dennis@localhost lio-iscsi]$ grep -rl &#39;write-thru&#39; /lib/python2.7/site-packages/</code><br>/lib/python2.7/site-packages/targetcli/ui_backstore.pyc<br>/lib/python2.7/site-packages/targetcli/ui_backstore.pyo<br>/lib/python2.7/site-packages/targetcli/ui_backstore.py<br>[dennis@localhost lio-iscsi]$ grep -rn ‘write-thru’ /lib/python2.7/site-packages/targetcli/ui_backstore.py<br>447:            wb_str = “write-thru”<br>460:            wb_str = “write-thru”   </li>
<li>vim /lib/python2.7/site-packages/targetcli/ui_backstore.py<br>class UIBlockStorageObject(UIStorageObject):  <pre><code>def summary(self):  
    so = self.rtsnode  
    if so.write_back:  
        wb_str = &quot;write-back&quot;  
    else:  
        wb_str = &quot;write-thru&quot;  
</code></pre></li>
<li>检查ui_backstore.py代码<code>class UIBlockBackstore(UIBackstore):</code>,对于block不存在’write_back’选项.</li>
<li>write_back option only effect for FILEIO<br>[root@localhost src]# targetcli /backstores/fileio/ create fileio01.dat /tmp/fileio01.dat 10M write_back=False<br>Created fileio fileio01.dat with size 10485760<br>[root@localhost src]# ls /tmp/fileio01.dat -lh<br>-rw-r–r–. 1 root root 10M Feb  3 15:01 /tmp/fileio01.dat<br>[root@localhost src]# targetcli /backstores/fileio/ ls<br>o- fileio ……………………………………………… [Storage Objects: 1]<br>  o- fileio01.dat ………….. [/tmp/fileio01.dat (10.0MiB) write-thru deactivated]<br>[root@localhost src]# targetcli /backstores/fileio/ create fileio02.dat /tmp/fileio02.dat 10M write_back=True<br>Created fileio fileio02.dat with size 10485760<br>[root@localhost src]# targetcli /backstores/fileio/ ls<br>o- fileio ……………………………………………… [Storage Objects: 2]<br>  o- fileio01.dat ………….. [/tmp/fileio01.dat (10.0MiB) write-thru deactivated]<br>  o- fileio02.dat ………….. [/tmp/fileio02.dat (10.0MiB) write-back deactivated]  </li>
<li>For block type storage object, how can i do wb or wt setting for it?</li>
<li>Another problem, how to access initiator by specify ip address?</li>
</ul>
</li>
<li>Install Emulex driver for Windows 2008 server R2<ul>
<li>double click elxdrvr-nic-10.2.478.1-5.exe </li>
<li>unpacked all drivers (remember the install directory)</li>
<li>after done the installation, go to device manager find the ethernet item</li>
<li>update driver -&gt; update by local directory, select the installation directory</li>
</ul>
</li>
</ul>
<h4 id="2015-01-22"><a href="#2015-01-22" class="headerlink" title="2015-01-22"></a>2015-01-22</h4><ul>
<li>LIO coding</li>
<li>★★★ <a href="http://blog.csdn.net/yangzhongxuan/article/details/7918884" target="_blank" rel="external">nfs的传输速度优化</a><ul>
<li>设置块大小 <ul>
<li>time dd if=/dev/zero of=/testfs/testfile bs=8k count=1024 测试nfs写</li>
<li>time dd if=/testfs/testfile of=/dev/null bs=8k 测试nfs读</li>
</ul>
</li>
<li>网络传输包的大小<ul>
<li>ping -s 2048 -f hostname, try different package size</li>
<li>nfsstat －o net</li>
<li>tracepath node1/端口号</li>
<li>ifconfig eth0</li>
<li>ifconfig eth0 mtu 16436, modify MTU value</li>
<li>/proc/sys/net/ipv4/ipfrag_high_thresh和/proc/sys/net/ipv4/ipfrag_low_thresh</li>
</ul>
</li>
<li>nfs挂载的优化<ul>
<li>timeo:如果超时，客户端等待的时间，以十分之一秒计算。</li>
<li>retrans：超时尝试的次数。</li>
<li>bg：后台挂载，很有用</li>
<li>hard：如果server端没有响应，那么客户端一直尝试挂载。</li>
<li>wsize：写块大小</li>
<li>rsize：读块大小</li>
<li>intr：可以中断不成功的挂载</li>
<li>noatime：不更新文件的inode访问时间，可以提高速度。</li>
<li>async：异步读写。</li>
</ul>
</li>
<li>nfsd的个数<ul>
<li>ps -efl |grep nfsd</li>
<li>vi /etc/init.d/nfs, modify RPCNFSDCOUNT </li>
<li>service nfs restart</li>
</ul>
</li>
<li>nfsd的队列长度<ul>
<li>/proc/sys/net/core/rmem_default</li>
<li>/proc/sys/net/core/rmem_max</li>
<li>/proc/sys/net/core/wmem_default</li>
<li>/proc/sys/net/core/wmem_max</li>
<li>vi /etc/sysctl.conf</li>
</ul>
</li>
<li>mount 192.168.1.220:/mnt/nfs /mnt/nfs_t -o nolock, rsize=1024,wsize=1024,timeo=15</li>
</ul>
</li>
</ul>
<h4 id="2015-01-21"><a href="#2015-01-21" class="headerlink" title="2015-01-21"></a>2015-01-21</h4><ul>
<li><a href="http://www.xuanhun521.com/Blog/b2b13faa-1052-4681-b468-eaa326056fdd" target="_blank" rel="external">不用翻墙也能用google</a></li>
<li>Vim<ul>
<li><code>:%TOhtml</code> translate to html format</li>
<li><code>g?</code> translate the selected content by <a href="https://en.wikipedia.org/wiki/ROT13" target="_blank" rel="external">ROT13</a>, using <code>u</code> to cancel operation</li>
</ul>
</li>
<li>安全操作系统<ul>
<li><a href="http://zh.wikipedia.org/wiki/BackTrack" target="_blank" rel="external">BackTrack</a></li>
<li><a href="http://zh.wikipedia.org/wiki/Kali_Linux" target="_blank" rel="external">Kali linux</a><ul>
<li>nmap</li>
<li>wireshark</li>
<li>John and Ripper</li>
<li>Aircrack-ng</li>
<li>metasploit</li>
</ul>
</li>
</ul>
</li>
<li>Linux check/modify MTU<ul>
<li>netstat -i </li>
<li>cat /sys/class/net/eth0/mtu</li>
<li>echo “1460” &gt; /sys/class/net/eth0/mtu</li>
<li><a href="http://blog.csdn.net/codejoker/article/details/5997447" target="_blank" rel="external">http://blog.csdn.net/codejoker/article/details/5997447</a></li>
</ul>
</li>
<li>Linux NFS服务性能优化<ul>
<li>nfsstat -rc</li>
<li><a href="http://blog.chinaunix.net/uid-24404943-id-3389539.html" target="_blank" rel="external">http://blog.chinaunix.net/uid-24404943-id-3389539.html</a></li>
<li>NFS的队列大小, modify server and client machine: (262144 = 256KB)<br>#echo 262144 &gt; /proc/sys/net/core/rmem_default<br>#echo 262144 &gt; /proc/sys/net/core/rmem_max<br>#echo 262144 &gt; /proc/sys/net/core/wmmen_default<br>#echo 262144 &gt; /proc/sys/net/core/wmmen_max  </li>
<li>[root@localhost iperf-2.0.5]# dd if=/dev/zero of=/tmp/test01.dat bs=1M count=10240<br>10240+0 records in<br>10240+0 records out<br>10737418240 bytes (11 GB) copied, 28.2585 s, 380 MB/s  </li>
<li>ping -s 2048 -f 192.16.110.80</li>
<li><a href="http://www.cnblogs.com/derekchen/archive/2013/01/17/2865207.html" target="_blank" rel="external">http://www.cnblogs.com/derekchen/archive/2013/01/17/2865207.html</a></li>
<li><a href="http://www.lichaozheng.info/2011/10/13/nfs性能优化/" target="_blank" rel="external">http://www.lichaozheng.info/2011/10/13/nfs性能优化/</a></li>
<li><a href="http://blog.csdn.net/anghlq/article/details/8532312" target="_blank" rel="external">http://blog.csdn.net/anghlq/article/details/8532312</a></li>
<li>tracepath 192.16.110.80</li>
<li>[root@localhost iperf-2.0.5]# echo “4096” &gt;/sys/class/net/enp10s0f0/mtu</li>
<li>[root@localhost iperf-2.0.5]# dd if=/dev/zero of=/tmp/test04.dat bs=1M count=10240<br>10737418240 bytes (11 GB) copied, 28.0778 s, 382 MB/s  </li>
</ul>
</li>
<li>linux find NFS version, using command <code>nfsstat -m</code> on client machine, 找到字符串”vers=4.0”<ul>
<li><a href="http://network.51cto.com/art/201008/216664.htm" target="_blank" rel="external">对比分析各个NFS版本的特点</a></li>
</ul>
</li>
<li>linux NIC performance Testing:<ul>
<li>netperf<ul>
<li>./netserver</li>
<li>./netperf -H 192.168.1.40 </li>
<li><a href="http://www.cppblog.com/fwxjj/archive/2013/11/22/204377.html" target="_blank" rel="external">http://www.cppblog.com/fwxjj/archive/2013/11/22/204377.html</a></li>
</ul>
</li>
<li>iperf<ul>
<li>iperf -s</li>
<li>iperf -c 192.16.110.1 -f M</li>
<li><a href="http://blog.chinaunix.net/uid-20778443-id-94533.html" target="_blank" rel="external">iperf使用总结</a></li>
</ul>
</li>
<li>./src/iperf -s<br>++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++<br>Server listening on TCP port 5001<br>TCP window size: 85.3 KByte (default)<br>++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++<br>[  4] local 192.16.110.80 port 5001 connected with 192.16.110.50 port 43341<br>[ ID] Interval       Transfer     Bandwidth<br>[  4]  0.0-10.0 sec  9.20 GBytes  7.90 Gbits/sec<br>[  5] local 192.16.110.80 port 5001 connected with 192.16.110.50 port 43342<br>[  5]  0.0-10.0 sec  9.26 GBytes  7.95 Gbits/sec<br>[  4] local 192.16.110.80 port 5001 connected with 192.16.110.50 port 43343<br>[  4]  0.0-10.0 sec  8.98 GBytes  7.71 Gbits/sec  </li>
<li>./src/iperf -c 192.16.110.80 -f M -i 2<br>++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++<br>Client connecting to 192.16.110.80, TCP port 5001<br>TCP window size: 0.02 MByte (default)<br>++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++<br>[  3] local 192.16.110.50 port 43343 connected with 192.16.110.80 port 5001<br>[ ID] Interval       Transfer     Bandwidth<br>[  3]  0.0- 2.0 sec  1598 MBytes   799 MBytes/sec<br>[  3]  2.0- 4.0 sec  1919 MBytes   960 MBytes/sec<br>[  3]  4.0- 6.0 sec  1892 MBytes   946 MBytes/sec<br>[  3]  6.0- 8.0 sec  1894 MBytes   947 MBytes/sec<br>[  3]  8.0-10.0 sec  1893 MBytes   947 MBytes/sec<br>[  3]  0.0-10.0 sec  9196 MBytes   920 MBytes/se  </li>
<li>从上面的测试看，网卡在没有做任何优化情况下可以跑到近950MB/s,已经很可以了.</li>
<li>既然问题不在磁盘(本地dd达到1.1GB/s)，也不在网卡(iperf测试达到950MB/s)，<br>哪到底NFS性能低下(375MB/s)的原因是什么呢?NFS协议本身吗?</li>
</ul>
</li>
<li>yum<ul>
<li>yum clean all</li>
<li>yum check-update</li>
<li>yum install net-tools (for command: route)</li>
</ul>
</li>
<li>Emulex万兆网卡NAS共享性能测试(NFS), 服务器系统为: CentOS 7.0.1406<ul>
<li><code>ethtool -i enp10s0f0</code>, version : 10.0.600.0r </li>
<li>yum install nfs-utils (for command: showmount)</li>
<li><code>dd if=/dev/zero of=/tmp/7test01.file bs=1M count=10240</code>, result:28.7827 s, 373 MB/s </li>
<li>scp be2net-10.2.470.14-1.src.rpm root@172.16.130.17:/root/</li>
<li>rpm -ivh be2net-10.2.470.14-1.src.rpm </li>
<li>yum install rpm-build -y</li>
<li>cd rpmbuild/SPECS; rpmbuild -ba benet.kmp.spec</li>
<li>scp CentOS-7.0-1406-x86_64-DVD.iso root@172.16.130.17:/root/</li>
<li>mkdir /media/cdrom</li>
<li>mount -t iso9660 CentOS-7.0-1406-x86_64-DVD.iso /media/cdrom</li>
<li>vim /etc/yum.repos.d/CentOS-Media.repo</li>
<li>mv /etc/yum.repos.d/CentOS-Base.repo{,.bak}</li>
<li>yum clean all</li>
<li>yum makecache</li>
<li>yum install kernel-devel gcc</li>
<li>rpmbuild -ba benet.kmp.spec</li>
<li>lspci</li>
<li>ipaddr</li>
<li>ethtool -i enp10s0f0</li>
<li>modinfo be2net</li>
<li>scp root@172.16.130.17:/root/be2net.ko ./</li>
<li>rpm -ivh rpmbuild/RPMS/x86_64/kmod-be2net-10.2.470.14-1.x86_64.rpm</li>
<li>安装完毕新的驱动(10.2.470.14-1)，dd测试的速度只有370MB/s，奇怪，不是驱动问题?</li>
<li>直接本地dd测试，速度有1.1GB/s, 所以不是raid的问题</li>
<li>blockdev –getra /dev/sdb, result: 256</li>
<li>blockdev –setra 16384 /dev/sdb</li>
<li>blockdev –setra 16384 /dev/mapper/h55-n1</li>
<li>dd测试的速度只有375MB/s</li>
<li>iostat 1, get Blk_wrtn/s : 738000.00 (/dev/sdb)<ul>
<li>Blk_wrtn/s: 每秒写扇区数量 (一扇区为512bytes)</li>
<li>echo 738000*512/1024/1024 |bc, result: 360, means 360MB/s</li>
</ul>
</li>
<li>会不会是CPU问题，看了下在服务器做dd测试的时候，CPU几乎跑满(kworker/2:0占98%,dd约占59%)<br>但查看vmstat 1，没有发现异常，cpu使用占一半</li>
<li>回头看看2014-10-17的测试, 之前测试Chelsio和intel的smb共享，速度也只有380MB/s左右.<br>所以，搞不好这里375MB/s的速度也差不多了？</li>
</ul>
</li>
<li><a href="http://www.cnblogs.com/marvin/p/4227431.html" target="_blank" rel="external">从四分钟到两秒——谈谈客户端性能优化的一些最佳实践</a><ul>
<li>基本的原则是要遵循的：<ul>
<li>站在用户的角度思考问题</li>
<li>永远不要把选择交给用户</li>
<li>必须考虑最极端恶劣的情况</li>
</ul>
</li>
<li>快系统响应的基本手法<ul>
<li>按需获取</li>
<li>延迟加载</li>
<li>化曲为直</li>
<li>缓存</li>
<li>异步</li>
<li>归并处理</li>
<li>视觉欺骗<ul>
<li>给出提示信息或者进度条</li>
<li>偷偷加载</li>
<li>简化数据</li>
</ul>
</li>
</ul>
</li>
<li>程序稳定性<ul>
<li>使用单元测试</li>
<li>提供完善的日志信息</li>
</ul>
</li>
</ul>
</li>
<li><a href="http://www.cnblogs.com/subconscious/p/4107357.html" target="_blank" rel="external">从机器学习谈起</a><ul>
<li>什么是机器学习 <ul>
<li>机器学习方法是计算机利用已有的数据(经验)，得出了某种模型(迟到的规律)，并<br>利用此模型预测未来(是否迟到)的一种方法。 </li>
<li>从广义上来说，机器学习是一种能够赋予机器学习的能力以此让它完成直接编程无法完成的功能的方法。  </li>
<li>从实践的意义上来说，机器学习是一种通过利用数据，训练出模型，然后使用模型预测的一种方法。</li>
</ul>
</li>
<li>机器学习的范围<ul>
<li>模式识别，统计学习，数据挖掘，计算机视觉，语音识别，自然语言处理</li>
</ul>
</li>
<li>机器学习的方法<ul>
<li>回归算法: 线性回归和逻辑回归</li>
<li>神经网络 </li>
<li>SVM（支持向量机）</li>
<li>聚类算法</li>
<li>降维算法</li>
<li>推荐算法</li>
</ul>
</li>
<li><a href="https://github.com/liuruoze/EasyPR" target="_blank" rel="external">EasyPR</a></li>
<li>EasyPR是一个中文的开源车牌识别系统，其目标是成为一个简单、高效、准确的车牌识别引擎。 </li>
<li><a href="http://www.cnblogs.com/subconscious/p/3979988.html" target="_blank" rel="external">EasyPR–一个开源的中文车牌识别系统</a></li>
</ul>
</li>
</ul>
<h4 id="2015-01-20"><a href="#2015-01-20" class="headerlink" title="2015-01-20"></a>2015-01-20</h4><ul>
<li>Emulex 10G NIC Test(NAS)<ul>
<li>time dd if=/dev/zero of=/tmp/10GB.file bs=1M count=10240<ul>
<li>200MB/s</li>
</ul>
</li>
<li>time dd of=/dev/null if=/tmp/10GB.file bs=1M<ul>
<li>170MB/s</li>
</ul>
</li>
<li>130.60 storage machine, <code>ethtool -i eth2 |grep version</code>, 10.2.470.14 </li>
<li>130.17 server machine, <code>ethtool -i eth2 |grep &#39;^version&#39;</code>, 4.4.161.0r <ul>
<li><code>cat /etc/centos-release</code>, output “CentOS release 6.4 (Final)”</li>
<li><code>echo &quot;proxy=http://172.16.50.39:3128&quot;&gt;&gt;/etc/yum.conf</code>, add yum proxy</li>
<li>kernel-devel.x86_64 : Development package for building kernel modules to match the kernel</li>
<li><code>yum install kernel-devel kernel-headers kernel -y</code>, download size 60MB</li>
<li><code>yum install redhat-rpm-config</code></li>
<li><code>yum install gcc</code>, download size 35MB</li>
<li>reference <a href="http://www.chenjunlu.com/2012/08/how-to-install-nic-driver-on-oracle-vm-server/" target="_blank" rel="external">http://www.chenjunlu.com/2012/08/how-to-install-nic-driver-on-oracle-vm-server/</a></li>
<li>rpmbuild be2net driver</li>
<li>rpm -ivh kmod-be2net-10.2.470.14-1.x86_64.rpm </li>
<li>reboot</li>
</ul>
</li>
<li>130.17 server machine<ul>
<li>showmount -e 192.16.110.80</li>
<li>mount 192.16.110.80:/share/n1 /tmp</li>
</ul>
</li>
<li>130.17 Centos 6.4的机器安装了新内核以及相关开发包和头文件，编译驱动包也成功，<br>但是无法从新内核启动，所以达不到统一驱动版本测试的目的。作罢，换系统吧。<br>好像错了，应该试一试把该系统的iso文件mount上去，然后装相关安装包，也许可以.</li>
<li>[dennis@localhost ~]$ ls /mnt/dvd/Packages/ |grep ‘^kernel’<br>kernel-2.6.32-358.el6.x86_64.rpm<br>kernel-debug-2.6.32-358.el6.x86_64.rpm<br>kernel-debug-devel-2.6.32-358.el6.x86_64.rpm<br>kernel-devel-2.6.32-358.el6.x86_64.rpm<br>kernel-doc-2.6.32-358.el6.noarch.rpm<br>kernel-firmware-2.6.32-358.el6.noarch.rpm<br>kernel-headers-2.6.32-358.el6.x86_64.rpm  </li>
</ul>
</li>
<li>172.16.50.XX ping 172.16.130.17, had not response; After <code>route add default gw 172.16.130.1 eth2</code>,<br>ssh login ok.</li>
<li>how to cover your tracks</li>
<li>what your learn from Mandiant_APT1_Report.pdf <ul>
<li>when you start doing hack, should register new account(random account), not<br>using the real IP address which give your information away. </li>
<li>tools</li>
<li>scripts</li>
</ul>
</li>
<li>iscsi mutual CHAP(iscsi双向认证)<ul>
<li><a href="http://blog.csdn.net/sinchb/article/details/8433994#t17" target="_blank" rel="external">iSCSI CHAP认证不完全攻略</a></li>
</ul>
</li>
</ul>
<h4 id="2015-01-19"><a href="#2015-01-19" class="headerlink" title="2015-01-19"></a>2015-01-19</h4><ul>
<li>使用popen执行shell命令，在pclose后出现”Broken pipe”; 原因pclose会马上关闭管道,<br>但shell命令在另外一个进程(fork出来的)却试图输出信息到该关闭的管道(pipe)。<ul>
<li>参考 <a href="http://stackoverflow.com/questions/15564014/the-issue-when-using-popen-and-pclose" target="_blank" rel="external">http://stackoverflow.com/questions/15564014/the-issue-when-using-popen-and-pclose</a></li>
<li>参考 <a href="http://blog.chinaunix.net/uid-26707720-id-3965207.html" target="_blank" rel="external">http://blog.chinaunix.net/uid-26707720-id-3965207.html</a></li>
<li>另外，关于调用Linux c中targetcli出现”[Errno 32] Broken pipe”, 原因应该是python<br>脚本写的问题。参考 <a href="http://stackoverflow.com/questions/14207708/ioerror-errno-32-broken-pipe-python" target="_blank" rel="external">http://stackoverflow.com/questions/14207708/ioerror-errno-32-broken-pipe-python</a></li>
</ul>
</li>
<li><code>define ISCSI_PARAM_DEFAULT {&quot;wb&quot;, &quot;fileio&quot;, &quot;512&quot;, 2, 0}</code>, default type is fileio<br> the new iscsi should support fileio too.</li>
<li><a href="http://stackoverflow.com/questions/15466782/parsing-command-line-options-with-multiple-arguments-getopt" target="_blank" rel="external">Parsing command line options with multiple arguments</a></li>
</ul>
<h4 id="2015-01-16"><a href="#2015-01-16" class="headerlink" title="2015-01-16"></a>2015-01-16</h4><ul>
<li>请假 </li>
</ul>
<h4 id="2015-01-15"><a href="#2015-01-15" class="headerlink" title="2015-01-15"></a>2015-01-15</h4><ul>
<li>请假 </li>
</ul>
<h4 id="2015-01-14"><a href="#2015-01-14" class="headerlink" title="2015-01-14"></a>2015-01-14</h4><ul>
<li>请假 </li>
</ul>
<h4 id="2015-01-13"><a href="#2015-01-13" class="headerlink" title="2015-01-13"></a>2015-01-13</h4><ul>
<li>测试人员反馈，一台存储，两台windows的服务器，测试万兆网卡直连情况下的nas性能,<br>问题是其中一台服务器连不上存储。经查，发现两台服务器都设置静态IP，但是IP地址<br>都设置成了192.16.110.60,导致其中一台使用ipconfig查到的ip有问题，所以无法连通.</li>
<li>targetcli删除iqn前不用删除luns, <code>targetcli /iscsi delete WWN</code></li>
<li>linux find geographic location of an ip address<ul>
<li><code>curl ipinfo.io/IP_ADDRESS</code></li>
<li>另外一种方法，安装geoip, <code>yum install geoip</code>, 如果继续安装GeoIP数据库(MaxMind)<br>将可以查到更新详细的地址信息。<ul>
<li><code>geoiplookup 23.66.166.151</code></li>
<li><code>geoiplookup -f /usr/share/GeoIP/GeoLiteCity.dat 23.66.166.151</code></li>
</ul>
</li>
<li>bash script<br>#!/bin/bash  <h1 id="NOTICE-run-the-script-with-root"><a href="#NOTICE-run-the-script-with-root" class="headerlink" title="!!!NOTICE: run the script with root"></a>!!!NOTICE: run the script with root</h1><h1 id="check-and-install-geoip"><a href="#check-and-install-geoip" class="headerlink" title="check and install geoip"></a>check and install geoip</h1>which geoiplookup ||yum install geoip  <h1 id="download-and-install-MaxMind-database"><a href="#download-and-install-MaxMind-database" class="headerlink" title="download and install MaxMind database"></a>download and install MaxMind database</h1>wget <a href="http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz" target="_blank" rel="external">http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz</a><br>wget <a href="http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz" target="_blank" rel="external">http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz</a><br>wget <a href="http://download.maxmind.com/download/geoip/database/asnum/GeoIPASNum.dat.gz" target="_blank" rel="external">http://download.maxmind.com/download/geoip/database/asnum/GeoIPASNum.dat.gz</a><br>gunzip GeoIP.dat.gz<br>gunzip GeoIPASNum.dat.gz<br>gunzip GeoLiteCity.dat.gz<br>rm -f GeoIP.dat.gz GeoIPASNum.dat.gz GeoLiteCity.dat.gz<br>mkdir -p /usr/share/GeoIP/<br>mv GeoIP.dat GeoIPASNum.dat GeoLiteCity.dat /usr/share/GeoIP/   </li>
<li>根据经纬度信息，在地图上查看具体位置信息.<ul>
<li>使用拾取坐标系统 <a href="http://api.map.baidu.com/lbsapi/getpoint/index.html" target="_blank" rel="external">http://api.map.baidu.com/lbsapi/getpoint/index.html</a></li>
<li>注意上面的坐标反查系统，使用的经纬度跟geoiplookup的是相反的!<br>比如得到的是”25.107854,121.549153”, 要使用”121.549153,25.107854”去查</li>
</ul>
</li>
<li><a href="http://xmodulo.com/geographic-location-ip-address-command-line.html" target="_blank" rel="external">http://xmodulo.com/geographic-location-ip-address-command-line.html</a></li>
</ul>
</li>
</ul>
<h4 id="2015-01-12"><a href="#2015-01-12" class="headerlink" title="2015-01-12"></a>2015-01-12</h4><ul>
<li>上传be2netrpm包和源码到svn</li>
<li>rpm包如何制作 <ul>
<li>steps<ul>
<li><code>rpm -q rpm-build</code>, 为检查是否安装rpm-build</li>
<li>创建spec文件</li>
<li>将 XXX.tar.gz 文件复制到 SOURCES</li>
<li><code>rpmbuild -ba SPECS/hellorpm.spec</code> </li>
</ul>
</li>
<li>运行 rpmbuild -ba filename.spec 时，RPM 都做些什么 <ul>
<li>读取并解析 filename.spec 文件</li>
<li>运行 %prep 部分来将源代码解包到一个临时目录，并应用所有的补丁程序。</li>
<li>运行 %build 部分来编译代码。</li>
<li>运行 %install 部分将代码安装到构建机器的目录中。</li>
<li>读取 %files 部分的文件列表，收集文件并创建二进制和源 RPM 文件。</li>
<li>运行 %clean 部分来除去临时构建目录</li>
</ul>
</li>
<li>Reference<ul>
<li><a href="http://blog.chinaunix.net/uid-21123336-id-1830527.html" target="_blank" rel="external">http://blog.chinaunix.net/uid-21123336-id-1830527.html</a></li>
<li><a href="http://www.ibm.com/developerworks/cn/linux/management/package/rpm/part1/index.html" target="_blank" rel="external">http://www.ibm.com/developerworks/cn/linux/management/package/rpm/part1/index.html</a></li>
<li><a href="http://www.ibm.com/developerworks/cn/linux/management/package/rpm/part2/index.html" target="_blank" rel="external">http://www.ibm.com/developerworks/cn/linux/management/package/rpm/part2/index.html</a></li>
<li><a href="http://www.ibm.com/developerworks/cn/linux/management/package/rpm/part3/" target="_blank" rel="external">http://www.ibm.com/developerworks/cn/linux/management/package/rpm/part3/</a></li>
</ul>
</li>
</ul>
</li>
<li>查看RPM包里的内容 <ul>
<li>如果只相知道包里的文件列表执行： <code>rpm -qpl packetname</code></li>
<li>如果想要导出包里的内容，而不是安装，那么执行： <code>rpm2cpio pkgname | cpio -iv</code></li>
<li><a href="http://blog.csdn.net/yetyongjin/article/details/6735165" target="_blank" rel="external">http://blog.csdn.net/yetyongjin/article/details/6735165</a></li>
</ul>
</li>
<li><a href="http://my.oschina.net/chenguang/blog/366179" target="_blank" rel="external">Netfilter/Iptables入门</a><ul>
<li>iptables -t filter -L </li>
<li>iptables -t nat -L </li>
<li>iptables -t mangle -L </li>
<li>iptables -t raw -L </li>
</ul>
</li>
<li>Netfilter example:<ul>
<li>禁止内网用户访问<a href="http://www.website.com" target="_blank" rel="external">http://www.website.com</a><br>#iptables –A FORWARD –p tcp –I eth1 –o eth0 –d www.website.com –j DROP</li>
<li>匹配目的端口<br>#iptables –A FORWARD –i eth1 –o eth0 –p tcp –s 192.168.11.0/24 –dport 21:22 –j REJECT</li>
<li>Mac地址匹配<br>#iptables –A INPUT –p tcp –dport 1433 –m mac –mac-source 00:0c:29:53:ab:60 –j ACCEPT</li>
<li>IP地址范围匹配<br>#iptables –A INPUT –m iprange –src-range 192.168.11.110-192.168.11.150 –j DROP</li>
<li>对封包内承载内容进行匹配<br>#iptables –A FORWARD –I eth0 –o eth1 –p tcp –d 10.0.0.1 –dport 80 –m string –algo bm –string “system32” –j DROP</li>
</ul>
</li>
<li>Netfilter这三种封包类型<ul>
<li>INPUT</li>
<li>OUTPUT</li>
<li>FORWARD</li>
</ul>
</li>
<li>iptables实战<ul>
<li>Iptables语法<br><strong>Iptables [-t table] command [chain] [rules] [-j target]</strong> </li>
<li>禁止192.168.11.100主机ping本机<br>#iptables –A INPUT –p icmp –s 192.168.11.100 –j DROP </li>
<li>允许192.168.11.100主机可以ssh登录本机<br>#iptables –A INPUT –p tcp s0 192.168.11.100 –dport 22 –j ACCEPT</li>
</ul>
</li>
</ul>
<h4 id="2015-01-09"><a href="#2015-01-09" class="headerlink" title="2015-01-09"></a>2015-01-09</h4><ul>
<li>使用VPN会怎样泻露个人信息<ul>
<li>论坛登陆时，第一次注册没有使用VPN</li>
<li>侦察人员与VPN提供商合作</li>
<li>…</li>
</ul>
</li>
<li>信息安全:<ul>
<li><a href="http://www.zhihu.com/topic/19561983" target="_blank" rel="external">http://www.zhihu.com/topic/19561983</a></li>
<li>零基础如何学习 Web 安全: <a href="http://www.zhihu.com/question/21606800" target="_blank" rel="external">http://www.zhihu.com/question/21606800</a></li>
<li>安全研究员是从哪学到知识 <a href="http://www.zhihu.com/question/23073812" target="_blank" rel="external">http://www.zhihu.com/question/23073812</a></li>
<li><a href="http://www.zhihu.com/question/21680381" target="_blank" rel="external">http://www.zhihu.com/question/21680381</a></li>
</ul>
</li>
<li>暂时汇总:<ul>
<li>当前已经在存储上看了以下相关信息:<ul>
<li>磁盘组，逻辑卷是否有问题</li>
<li>网络(netstat)是否有问题</li>
<li>IET是否有明显报错?</li>
</ul>
</li>
<li>当前有疑点的信息:<ul>
<li>网口 Down/Up</li>
<li>存储出现大量的logout, 为什么?</li>
<li>vms_restart.sh的内容是什么</li>
<li>为什么网口速度从1000变为100?什么情况下会发生?</li>
</ul>
</li>
</ul>
</li>
<li><code>grep -rin error ./</code>搜索错误信息，没有发现明显问题</li>
<li>ifconfig和ip addr add区别:<ul>
<li>添加地址可以通过两个用户空间程序搞定，一个是ifconfig，另 一个是ip addr add，</li>
<li>ifconfig是基于ioctl进行地址添加的，而ip程序是基于netlink进行地址添加的 </li>
<li>为何用ip addr add添加的ip地址用ifconfig看不到，而ifconfig设置的地址ip addr show却是可以看到。<ul>
<li>取的是这个被找到的ifa的ip地址，而我们知道，所有的ifa链接成一个线性链表，<br>那么找到了第一个就不会再往后走了，因此只能得到一个结果，就是链表最前面的那个.</li>
<li>ip add show就不同了，具体在函数inet_dump_ifaddr中实现，该函数遍历所有的ifa，并且传到用户空间缓冲区。</li>
</ul>
</li>
<li><a href="http://blog.csdn.net/dog250/article/details/5303542/" target="_blank" rel="external">http://blog.csdn.net/dog250/article/details/5303542/</a></li>
</ul>
</li>
<li><code>ls ./ |sort -k5 -nr</code> 当前目录文件按大小排序显示</li>
<li>Advanced Bash-Scripting Guide <a href="http://www.tldp.org/LDP/abs/abs-guide.pdf" target="_blank" rel="external">http://www.tldp.org/LDP/abs/abs-guide.pdf</a><br>Revision History:  <ul>
<li>Revision 6.5 05 Apr 2012 Revised by: mc ‘TUNGSTENBERRY’ release</li>
<li>Revision 6.6 27 Nov 2012 Revised by: mc ‘YTTERBIUMBERRY’ release</li>
<li>Revision 10  10 Mar 2014 Revised by: mc ‘PUBLICDOMAIN’ releas</li>
</ul>
</li>
<li>存储sys/message.var, 出现”ietd: Received close MSG” 以及 “kernel: Received logout cmnd:”<ul>
<li>172.4.35.1  : <ul>
<li>12:02 出现, 直到20:33</li>
<li>12:08 至 19:23 频繁出现eth0 Down/Up</li>
</ul>
</li>
<li>172.4.35.4  : <ul>
<li>20:30出现, log也只有这个时间</li>
</ul>
</li>
<li>172.4.35.13 : <ul>
<li>19:05出现, 直到19:30</li>
</ul>
</li>
<li>172.4.35.141: <ul>
<li>21:03出现, log也只有这个时间</li>
</ul>
</li>
</ul>
</li>
<li>发现存储的message中出现logout都是在20:33，而此时服务器会跑vms_restart.sh   <ul>
<li>173.4.35.7<ul>
<li>Jan  8 20:46:57 出现多个盘的大量I/O error, </li>
</ul>
</li>
<li>173.4.35.9<ul>
<li>Jan  8 12:30:37 出现针对sdbu的大量I/O error, </li>
</ul>
</li>
<li>173.4.35.10<ul>
<li>Jan  8 12:30:35 至 20:56 出现针对sdbu的大量I/O error, </li>
</ul>
</li>
<li>173.4.35.11<ul>
<li>Jan  8 12:30:30 至 20:57 出现针对sdbu的大量I/O error, </li>
</ul>
</li>
<li>173.4.35.12<ul>
<li>Jan  8 12:30:30 至 20:57 出现针对sdbu的大量I/O error, </li>
</ul>
</li>
</ul>
</li>
<li>什么时候存储会dmesg会出现下面的信息:<br>kernel: Received logout cmnd: Target 34 Initiator: iqn.1996-04.de.suse:01:4ee4974b0d<br>kernel: Received logout cmnd: Target 6 Initiator: iqn.1996-04.de.suse:01:4ee4974b0dc<br>…<br>ietd: conn 0 session 6755400921448960lx target 17, state 0<br>ietd: Received close MSG: conn 0 session 6755400921448960lx target 17<br>…<br>kernel: Received logout cmnd: Target 3 Initiator: iqn.1996-04.de.suse:01:67117f255fac<br>ietd: Received close MSG: conn 0 session 32651101479961088lx target 38  </li>
<li>现场存储拼命出现网口eth0 down/up, 对存储有什么样影响吗?<br>Jan  8 12:08:32 SV1600A kernel: eth0: Link is Down<br>Jan  8 12:08:35 SV1600A kernel: eth0: Link is Up 1000 Mbps Full Duplex, Flow Control: None<br>…<br>Jan  8 19:22:27 SV1600A kernel: eth0: Link is Down<br>Jan  8 19:22:29 SV1600A kernel: eth0: Link is Up 1000 Mbps Full Duplex, Flow Control: None<br>Jan  8 19:23:09 SV1600A kernel: eth0: Link is Down<br>Jan  8 19:23:24 SV1600A kernel: eth0: Link is Up 1000 Mbps Full Duplex, Flow Control: None  </li>
<li>客户现场昨天(2015-01-08)又出现无法录像问题. </li>
</ul>
<h4 id="2015-01-08"><a href="#2015-01-08" class="headerlink" title="2015-01-08"></a>2015-01-08</h4><ul>
<li>TODO:<ul>
<li>完成季度考核</li>
<li>Emulex驱动加入NAS分支</li>
</ul>
</li>
<li><a href="http://blog.knownsec.com/Knownsec_RD_Checklist/v2.2.html#" target="_blank" rel="external">知道创宇研发技能表v2.2</a></li>
<li><a href="https://community.emc.com/thread/197851?start=0&amp;tstart=0" target="_blank" rel="external">网络基本功系列：细说网络那些事儿(1月8日更新)</a></li>
<li><code>cat test.md |tr -s &#39;[:space:]&#39; &#39;\n&#39; |tr &#39;[:upper:]&#39; &#39;[:lower:]&#39; |sort |uniq -c| sort -nr |head -10</code><br> 找出文档中出现多次的单词的前10个<ul>
<li>tr命令 translate, 主要用于替换、删除，可视为简单版的sed</li>
<li><a href="http://blog.chinaunix.net/uid-9525959-id-2001634.html" target="_blank" rel="external">http://blog.chinaunix.net/uid-9525959-id-2001634.html</a></li>
</ul>
</li>
<li>从应用层来讲是如何给scsi设备发送命令的.sg_inq实际上触发的是ioctl的系统调用,经<br>过几次辗转反侧,最终sd_ioctl会被调用.而sd_ioctl会调用scsi核心层提供的函数,sg_io,<br>最终走的路线依然是blk_execute_rq,而关于这个函数最终如何与usb-storage牵上手的,<br>我们在block层那边对scsi命令进行分析时已经详细的介绍过了.<ul>
<li><a href="http://dato0123.iteye.com/blog/1259924" target="_blank" rel="external">http://dato0123.iteye.com/blog/1259924</a></li>
<li><a href="http://blog.csdn.net/fudan_abc/article/details/6966911" target="_blank" rel="external">http://blog.csdn.net/fudan_abc/article/details/6966911</a></li>
</ul>
</li>
<li>测试5， 单ip情况<ul>
<li>结论: 存储不设置组IP，使用单ip连接<ul>
<li>[try twice]单台服务器不断开连接的情况下，重启存储，服务器discovery存储IP ok  </li>
<li>[try twice]两台服务器不断开连接的情况下，重启存储，两台服务器discovery存储IP Fail<br>但是，discovery 另外一个ip(eth1)是ok的</li>
</ul>
</li>
</ul>
</li>
<li>测试4， 组ip情况<ul>
<li>结论: 存储设置组IP<ul>
<li>单台服务器不断开连接的情况下，重启存储，服务器discovery存储组IP ok<br>但是，使用netstat -apn |grep 3260发现实际连接的不是组IP，是eth0和eth1网口</li>
<li>两台服务器不断开连接的情况下，重启存储，两台服务器discovery存储组IP Fail</li>
</ul>
</li>
</ul>
</li>
<li>测试3， 测试单ip情况<ul>
<li>1.storage ip: eth0:132, eth1:133</li>
<li>2.server 211 connection 132, and iscsiadm login; then reboot 132</li>
<li>3.after 132 done the reboot, test discovery on 211, it is ok</li>
<li>4.repeat 4 times of step 2 and step 3, test ok</li>
<li>5.add server 212 and 213 to test, login 132, reboot 132, discovery fail</li>
<li>6.reboot 132,  server 211,212,213 cann’t discovery 132.</li>
<li>7.看起来，单个IP在多个机器连接情况下，也无法正常discovery.在确认一次.</li>
<li>8.211,212 and 213 全部iscsiadm logout, 删node, 重启132, 211、212和213 discovery、login正常</li>
<li>9.重启132, 211、212和213 discovery失败</li>
<li>结论: 存储不设置组IP，使用单ip连接<ul>
<li>单台服务器不断开连接的情况下，重启存储，服务器discovery存储 ok</li>
<li>多台服务器不断开连接的情况下，重启存储，服务器discovery存储 fail</li>
<li>多台服务器在断开连接的情况下，重启存储，服务器discovery存储 ok</li>
</ul>
</li>
</ul>
</li>
<li>测试2<ul>
<li>130.211 执行命令<code>iscsiadm -m node -U all; iscsiadm -m node -o delete;</code></li>
<li>确认全部login到130.107服务器都断开, reboot 130.107</li>
<li>130.211 执行命令<code>lsscsi; iscsiadm -m discovery -t st -p 172.16.130.107;</code></li>
<li>结果: discovery ok</li>
<li>可是明明使用107来连接的，为什么使用netstat -apn |grep 3260查到的是108地址<br>这跟最早是使用108来连接有关吗?</li>
</ul>
</li>
<li>测试1<ul>
<li>存储机器，组IP 172.16.130.107, eth0:172.16.130.108, eth1:172.16.130.109</li>
<li>suse机器172.16.130.211, 使用iscsiadm -m discovery -t st -p 172.16.130.108; iscsiadm -m node -L all</li>
<li>130.107 reboot</li>
<li>130.211执行命令<code>iscsiadm -m discovery -t st -p 172.16.130.108;</code></li>
<li>结果: discovery ok</li>
</ul>
</li>
</ul>
<h4 id="2015-01-07"><a href="#2015-01-07" class="headerlink" title="2015-01-07"></a>2015-01-07</h4><ul>
<li>for i in {1..9} ; do ucli iscsi_access -A -d j0 -v j0test0$i -i 172.16.130.211 ; done</li>
<li>解压密码文件:/opt/scripts/common/sys_clear_all </li>
<li>是否升级，需要回答以下三个问题:  <ul>
<li>当前是什么原因造成问题，之前使用了两三年为什么没有问题.</li>
<li>升级会不会造成数据丢失、之前的配置是否有影响(比如磁盘组和虚拟盘会不会丢失)</li>
<li>升级后是不是还会出现同样的问题</li>
</ul>
</li>
<li><a href="http://172.19.1.142/trac" target="_blank" rel="external">http://172.19.1.142/trac</a></li>
</ul>
<h4 id="2015-01-06"><a href="#2015-01-06" class="headerlink" title="2015-01-06"></a>2015-01-06</h4><ul>
<li>编写c代码对JSON文件解析, 提取针对iqn的lun信息, targetcli做iscsi删除先删除lun，再删iqn.</li>
<li>Linux检查某个机器的某个端口是否开放, 使用ping是无法做到的.<ul>
<li>telnet 172.16.50.39 3128</li>
<li>nmap 172.16.50.39 -p 3128</li>
</ul>
</li>
<li>squid代理<ul>
<li>squid -CNd1</li>
<li>windows<ul>
<li>IE -&gt; tools -&gt; Connection -&gt; Lan Setting -&gt; 输入IP和端口3128，确认关闭</li>
<li><a href="http://linux.vbird.org/linux_server/0420squid.php#client_browser" target="_blank" rel="external">http://linux.vbird.org/linux_server/0420squid.php#client_browser</a></li>
</ul>
</li>
<li>Linux</li>
<li>通过关闭防火墙，解决连接问题<ul>
<li>对于Fedora 20, 无法通过service iptables stop/start/status来控制防火墙</li>
<li>systemctl stop firewalld 关闭防火墙</li>
<li>systemctl status firewalld 确认防火墙关闭状态</li>
<li>参考 <a href="http://stackoverflow.com/questions/24756240/how-can-i-use-iptables-on-centos-7" target="_blank" rel="external">http://stackoverflow.com/questions/24756240/how-can-i-use-iptables-on-centos-7</a></li>
</ul>
</li>
<li>通过设置iptable规则，解决连接问题<ul>
<li><code>iptables -L INPUT --line-number</code> 查看规则</li>
<li><code>iptables -I INPUT 7 -p tcp --dport 3128 -j ACCEPT</code> 在REJECT(这里是7号)  </li>
<li><code>iptables -D INPUT -p tcp --dport 3128 -j ACCEPT</code> 删除规则<br>规则前加入放行3128端口的连接 </li>
</ul>
</li>
<li><a href="http://linux.vbird.org/linux_server/0420squid.php" target="_blank" rel="external">http://linux.vbird.org/linux_server/0420squid.php</a></li>
<li><a href="http://home.arcor.de/pangj/squid/chap04.html" target="_blank" rel="external">http://home.arcor.de/pangj/squid/chap04.html</a></li>
<li><a href="http://viong.blog.51cto.com/844766/280978" target="_blank" rel="external">http://viong.blog.51cto.com/844766/280978</a></li>
</ul>
</li>
<li>wireshark 过滤指定端口数据规则: tcp.port eq 3128</li>
<li>测试一<ul>
<li>1.全部suse(IP:210~217)使用iscsiadm退出登陆<ul>
<li>iscsiadm -m node -U all;iscsiadm -m node -o delete</li>
<li>在suse上使用lsscsi确认都没有scsi卷了</li>
</ul>
</li>
<li>2.重启130.107, 确认没有suse机器连入<ul>
<li>netstat -apn |grep 3260 确认没有其他ip连入，只有107,108和109的监听</li>
</ul>
</li>
<li>3.suse 210~214共5台机器登陆130.107<ul>
<li>iscsiadm -m discovery -t st -p 172.16.130.107;iscsiadm -m node -L all</li>
<li>lsscsi 确认有scsi卷</li>
</ul>
</li>
<li>4.在130.107上确认有210~214登陆。然后重启130.107<ul>
<li>grep -c tid /proc/net/iet/volume 返回40. 40个卷</li>
<li>netstat -apn |grep 3260 |wc -l, 返回203, 正确了. 40个卷, 5个机器，200个连接，3个监听</li>
</ul>
</li>
<li>5.等130.107启动完毕后,查看210~214是否正常discovery 130.107?<ul>
<li>netstat -apn |grep 3260 发现连入107的连接都有问题，而且多了108和109的连接</li>
<li>虽然210~214都无法discovery 130.107, 但是对于108和109是没有问题的，这说明<br>只有组ip出现问题.而且210~214上使用lsscsi也可以看到scsi卷,说明即使discovery<br>不了107，也不会影响业务，但是如果这时全部断开连接，重新使用discovery连接<br>就影响业务了.</li>
<li>虽然组ip 130.107的discovery有问题，可是ssh登陆并没有受到影响，为什么?</li>
<li>既然组ip有问题，是否可以改用绑定呢？</li>
</ul>
</li>
</ul>
</li>
</ul>
<h4 id="2015-01-05"><a href="#2015-01-05" class="headerlink" title="2015-01-05"></a>2015-01-05</h4><ul>
<li>130.107版本回退测试, 完整记录:<ul>
<li>13.107重新安装系统，回退到旧版本UStor_1.3.1_20100106. 130.210无法discovery,<br>之前连接的网络也一下子全部连入107。 210～217，50.70和70.143共10台机器</li>
<li>210~217 8台suse, 全部logout，只保留之前50.70,70和143连接。发现210～217 8台<br>都无法discovery 107机器(中间也有重启107的iscsi服务)</li>
<li>50.70,70.143 2台机器也logout，重启iscsi服务，210～217 discovery和login都ok</li>
<li>reboot 130.107. 发现很多的Recv-Q有值,约500左右，TCP状态CLOSE_WAIT, IP归属210~213<br>不过，过了30秒左右，全部清空了。这时使用210和214来discovery，都timeout, 失败。<br>查看下，ietd进程都在。 取页面关闭iscsi服务，查看netstat，发现109和108两个IP<br>的3260端口有开放给215，256，217，TCP状态是TIME_WAIT.在210上discovery 107，108<br>和109都显示connect refused. 但在217上页无法discovery. 再次查看netstat，已没有<br>3260端口的连接。这应是正常，因为关闭了iscsi服务，3260端口也就不会开放了。<br>打开iscsi服务(在网页上操作)，netstat查看到210~217的连接，并且Recv-Q有些有500<br>左右的值，这时，discovery 108和109 ok，但是discovery 107(这是组ip)会失败.<br>为什么组IP无法discovery??????</li>
<li>重启机器130.107。 210~217 discovery 130.107失败，108和109成功。<br>网页禁用iscsi服务，netstat -apn |grep 3260还有108，但找不到107了。<br>网页启用iscsi服务，发现了很多107，Recv-Q有值的都是107ip的<br>210~217也无法通过107 discovery,但108和109是可以成功discovery的.</li>
</ul>
</li>
<li>130.107版本回退测试<ul>
<li>/usr/sbin/ietd -f -d 11<br>…(hide content)…<br>1420396717.362198: connection closed<br>1420396717.362209: [event_loop]connection close: conn sock=7<br>1420396717.362239: [event_loop]event_loop: incoming_cnt: 0  </li>
<li>strace /usr/sbin/ietd -f<br>…(hide content)…<br>poll([{fd=7, events=0}, {fd=8, events=POLLIN}, {fd=9, events=POLLIN},   <pre><code>{fd=0, events=0}, {fd=0, events=0}, {fd=0, events=0}, {fd=0, events=0},   
{fd=0, events=0}, {fd=5, events=POLLIN}, {fd=3, events=POLLIN},   
{fd=0, events=0}, {fd=0, events=0}, {fd=0, events=0},   
{fd=-1}, {fd=-1}, {fd=-1}, {fd=-1}, {fd=-1}, {fd=-1}, {fd=-1}, {fd=-1},   
{fd=-1}, {fd=-1}, {fd=-1}, {fd=-1}, {fd=-1}, {fd=-1}, {fd=-1}, {fd=-1},   
{fd=-1}, {fd=-1}, {fd=-1}, ...], 77, -1  
</code></pre></li>
</ul>
</li>
<li>root:~# grep -c sid /proc/net/iet/session<br>390  <ul>
<li><code>root:~# netstat -apn |grep 3260 |awk &#39;{print $5}&#39; |awk -F: &#39;{print $1}&#39; |sort |uniq -c</code><br>1 0.0.0.0<br>39 172.16.130.210<br>39 172.16.130.211<br>39 172.16.130.212<br>39 172.16.130.213<br>39 172.16.130.214<br>39 172.16.130.215<br>39 172.16.130.216<br>39 172.16.130.217<br>39 172.16.50.70<br>39 172.16.70.143  </li>
<li>reboot 130.107  </li>
</ul>
</li>
<li>linux-wdoa:~ # strace iscsiadm -m discovery -t st -p 172.16.130.100<br>…(hide content)..<br>link(“/etc/iscsi/lock”, “/etc/iscsi/lock.write”) = -1 EEXIST (File exists)<br>nanosleep({0, 10000000}, NULL)          = 0  </li>
<li>从昨天发现问题的情况时的检查看，情况是这样:<ul>
<li>3台其他版本+5台suse机器，login到存储130.107</li>
<li>reboot 130.107</li>
<li>ps查看，找不到iet的进程, 但/var/log/messages中发现iet是有运行过的.</li>
</ul>
</li>
<li><a href="https://groups.google.com/forum/#!topic/open-iscsi/nfJ29YPRpBU" target="_blank" rel="external">https://groups.google.com/forum/#!topic/open-iscsi/nfJ29YPRpBU</a> 这个讨论出现<br>类似的问题。  <ul>
<li>步骤<ul>
<li>a) Install IET 0.4.15 to work with 2.6.21 kernel</li>
<li>b) connect the initiator (open-iscsi 2.0-754)</li>
<li>c) play a bit, make sure everything works</li>
<li>d) if everything works, stop the target:  <h1 id="etc-init-d-iscsi-target-stop"><a href="#etc-init-d-iscsi-target-stop" class="headerlink" title="/etc/init.d/iscsi-target stop"></a>/etc/init.d/iscsi-target stop</h1></li>
<li>e) wait a couple of seconds (important!), and start the target again</li>
<li>f) on the initiator, issue this command:  <h1 id="iscsiadm-m-discovery-t-sendtargets-p"><a href="#iscsiadm-m-discovery-t-sendtargets-p" class="headerlink" title="iscsiadm -m discovery -t sendtargets -p "></a>iscsiadm -m discovery -t sendtargets -p <target_ip></target_ip></h1>It will take very long time to complete, and you will get “Login I/O<br>error, failed to receive a PDU”.  </li>
<li>If that command succeeds, do either:<br>reissue that same command again (three, four times or so) - it will fail<br>repeat e) and f) again.   </li>
</ul>
</li>
<li>碰到此类问题可以采取的检查措施:<ul>
<li>netstat </li>
<li>tcpdump</li>
</ul>
</li>
</ul>
</li>
<li>继续检查模拟环境:(检查步骤，最上面是最近的，下面是旧的)<ul>
<li>root:~# netstat -apn |grep 3260 |awk ‘{print $5,$1,$2,$3,$4}’ |sort |uniq –check-chars=14 -c<br> 1 0.0.0.0:* tcp 0 0 0.0.0.0:3260<br>39 172.16.130.210:41229 tcp 0 0 172.16.130.107:3260<br>39 172.16.130.211:34593 tcp 0 0 172.16.130.107:3260<br>39 172.16.130.212:55204 tcp 0 0 172.16.130.107:3260<br>39 172.16.130.213:43709 tcp 0 0 172.16.130.107:3260<br>39 172.16.130.214:60552 tcp 0 0 172.16.130.107:3260<br>39 172.16.50.70:41163 tcp 0 0 172.16.130.107:3260<br>39 172.16.70.143:51161 tcp 0 0 172.16.130.107:3260  </li>
<li>重启机器130.107没有发现问题(discovery 正常)</li>
<li>5台suse 全部logout login一遍，discovery ok</li>
<li>重启机器130.214, discovery ok</li>
<li>重启机器130.107没有发现问题(discovery 正常)</li>
<li><code>netstat -apn |grep 3260 |awk &#39;{if($2&gt;0||$3&gt;0){print $0}}&#39;</code> </li>
<li>8台机器都连接ok</li>
<li>启动5台机器(suse11 sp2, 130.21X)的链接 <ul>
<li><code>iscsiadm -m discovery -t st -p 172.16.130.107; iscsiadm -m node -L all; iscsiadm -m node</code></li>
</ul>
</li>
<li>关闭5台机器(suse11 sp2, 130.21X)的链接 <ul>
<li><code>iscsiadm -m node -U all; iscsiadm -m node -o delete; iscsiadm -m node</code></li>
</ul>
</li>
<li>重启机器130.107没有发现问题(discovery 正常)</li>
<li>在网页上关闭iscsi服务，启动服务，discovery正常</li>
<li>重启机器130.107没有发现问题(discovery 正常)</li>
<li><code>cat /proc/net/iet/session |grep ip |awk &#39;{print $2}&#39; |awk -F: &#39;{print $2}&#39; |sort |uniq -c</code><br>39 172.16.130.210<br>39 172.16.130.211<br>39 172.16.130.212<br>39 172.16.130.213<br>39 172.16.130.214<br>39 172.16.130.5<br>39 172.16.50.70<br>39 172.16.70.143<br>有8台机器在连接，312个session</li>
<li><code>cat /proc/net/iet/session |grep tid |wc -l</code> output <code>39</code></li>
<li><code>cat /etc/uitos-release</code> output <code>UStor_1.3.1_20120720</code></li>
<li>root:~# uname -a<br>Linux ustor 2.6.26.2-ustor20091016 #1 SMP PREEMPT Fri Jul 20 12:16:13 CST 2012 x86_64 x86_64 x86_64 GNU/Linux</li>
<li>Jan  4 18:28:05 ustor kernel: iSCSI Target - version 1.2.1</li>
<li>172.16.130.107 reboot需要大概1分30秒左右</li>
</ul>
</li>
<li>好像锐捷有使用公司的产品, <a href="http://www.ruijie.com.cn/" target="_blank" rel="external">http://www.ruijie.com.cn/</a></li>
<li>远程操作:  <ul>
<li>173.4.35.7上执行了iscsiadm，发现连接失败</li>
<li>35.1和35.4会出现Sen-Q大于0的情况，但很快就清零.</li>
<li>全部存储的IET版本是0.98.1，这个是很老版本</li>
<li>可以检查官方的IET从0.98.1升级到1.4.20过程中，都解决了哪些bug，搞不好就有解决<br>系统重启连接清理不干净的问题.<ul>
<li>从这里<a href="http://www.ruijie.com.cn/Service/BBSM/20100927041845.pdf" target="_blank" rel="external">http://www.ruijie.com.cn/Service/BBSM/20100927041845.pdf</a>可以看到98版本应该在2009年出来的.</li>
<li>从这里<a href="http://sourceforge.net/projects/iscsitarget/files/iscsitarget/" target="_blank" rel="external">http://sourceforge.net/projects/iscsitarget/files/iscsitarget/</a>可以<br>看到0.4.17升级到1.4.18是从2008-11-30到2009-10-05,所以98版本应该是在2009年10月前出的.</li>
<li>查看1.4.18版本的ChangeLog, 发现1.4.18解决了”clean up all connections,<br>sessions and targets in the kernel module if the daemon is gone” 不知是否有关系</li>
</ul>
</li>
</ul>
</li>
</ul>
<h4 id="2015-01-04"><a href="#2015-01-04" class="headerlink" title="2015-01-04"></a>2015-01-04</h4><ul>
<li>sshpass -p 123456 ssh root@172.16.130.210 “iscsiadm -m discovery -t st -p 172.16.130.107”</li>
<li>root:~# grep -i ‘iscsi target’ /var/log/messages<br>Jan  4 07:59:48 ustor kernel: iSCSI Target - version 1.2.1</li>
<li>root:~# grep 130.21 /proc/net/iet/session|awk ‘{print $2}’ |sort |uniq -c<br> 39 ip:172.16.130.210<br> 39 ip:172.16.130.211<br> 39 ip:172.16.130.212<br> 39 ip:172.16.130.213<br> 39 ip:172.16.130.214  </li>
<li>Recv-Q中有大量包没有及时被应用程序取走(recv函数调用)，说明recv函数调用没有返回了<br>那到底什么原因会造成这样的现象呢?<br>从tcpdump抓到的包看，客户端</li>
<li>root:~# netstat -apn  |grep 3260 |awk ‘{s+=$2} END{print s}’<br>16905  (comment: Recv-Q )  <ul>
<li>Recv-Q Send-Q分别表示网络接收队列，发送队列。Q是Queue的缩写。<br>这两个值通常应该为0，如果不为0可能是有问题的。  </li>
<li>通过netstat的这两个值就可以简单判断程序收不到包到底是包没到还是包没有被进程recv。</li>
<li><a href="http://ikon.iteye.com/blog/1603989" target="_blank" rel="external">http://ikon.iteye.com/blog/1603989</a></li>
<li><a href="http://blog.csdn.net/sjin_1314/article/details/9853163" target="_blank" rel="external">http://blog.csdn.net/sjin_1314/article/details/9853163</a></li>
</ul>
</li>
<li>tshark<ul>
<li>tshark -n -q -r tcpdump01.pcap  -z “io,stat,0,tcp.analysis.retransmission” </li>
<li>tshark -n -q -r tcpdump01.pcap  -z “io,stat,0,tcp.analysis.out_of_order” </li>
<li>tshark -n -q -r tcpdump01.pcap  -z “io,stat,5,tcp.analysis.out_of_order”</li>
<li>tshark -n -q -r tcpdump01.pcap  -z “io,stat,5,tcp.analysis.retransmission”</li>
<li>tshark -n -q -r tcpdump01.pcap  -R “ip.addr==172.16.130.214”</li>
</ul>
</li>
<li>root:~# tcpdump -i eth0 -w /tmp/tcpdump01-130.100.log<br>tcpdump: Couldn’t find user ‘pcap’<br>root:~# useradd pcap<br>root:~# tcpdump -i eth0 -w /tmp/tcpdump01-130.100.log<br>tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes<br>^C4485 packets captured<br>8972 packets received by filter<br>0 packets dropped by kernel<br>root:~#   </li>
<li><code>netstat -apn</code>, found 400+ on <code>Recv-Q</code></li>
<li><code>netstat -apn |grep 3260 |wc -l</code></li>
<li><code>iscsiadm -m node -L all</code> login all node</li>
<li>what is the version of iscsiadm used by customer?</li>
<li>open-iscsi:  <ul>
<li><a href="http://www.open-iscsi.org/" target="_blank" rel="external">open-iscsi office website</a></li>
<li><a href="http://blog.chinaunix.net/uid-14518381-id-3237994.html" target="_blank" rel="external">open-iscsi源码分析-iscsid</a></li>
<li>源码包是open-iscsi，经过rpm包封装后，名字是iscsi-initiator-utils  </li>
<li><a href="http://ixdba.blog.51cto.com/2895551/526452" target="_blank" rel="external">Refrence</a></li>
</ul>
</li>
<li>wireshark 查看 iscsiadm discovery过程<ul>
<li>Filter: ip.addr eq 172.16.130.100 and iscsi</li>
<li>No. Time Source Destination Protocol Length Info<br>54 5.674999 172.16.50.39   172.16.130.100  iSCSI  326 Login Command<br>57 5.675339 172.16.130.100 172.16.50.39    iSCSI  258 Login Response (Success)<br>60 5.675488 172.16.50.39   172.16.130.100  iSCSI   82 Text Command<br>62 5.708458 172.16.130.100 172.16.50.39    iSCSI  190 Text Response</li>
<li>上面这种过程是正确的，可以发现iscsi卷的数据包信息</li>
</ul>
</li>
<li>Testing:  <ul>
<li>172.16.130.100, storage server  <ul>
<li>root:~# cat /etc/uitos-release<br>UStor_2.0_20130503</li>
<li>2 diskgroup(r5,rd5)</li>
<li>32 iscsi-volumns(tt01~tt32, vv01~vv32), size for each volumn 100000MB</li>
<li>32 iscsi-volumns(tt01~tt32, vv01~vv32)</li>
<li>root:~# ip addr<br>…(hide other information)…<br>3: eth1: <broadcast,multicast,up,lower_up> mtu 1500 qdisc pfifo_fast qlen 1000  <pre><code>link/ether 00:25:90:77:0f:eb brd ff:ff:ff:ff:ff:ff  
inet 172.16.130.102/24 scope global eth1  
inet 172.16.130.100/24 scope global secondary eth1  
</code></pre>4: eth0: <broadcast,multicast,up,lower_up> mtu 1500 qdisc pfifo_fast qlen 1000  <pre><code>link/ether 00:25:90:77:0f:ea brd ff:ff:ff:ff:ff:ff  
inet 172.16.130.101/24 scope global eth0  
inet 172.16.130.100/24 scope global secondary eth0  
</code></pre></broadcast,multicast,up,lower_up></broadcast,multicast,up,lower_up></li>
</ul>
</li>
<li>172.16.130.210~214 test server<ul>
<li>linux-wdoa:~ # cat /etc/SuSE-release<br>SUSE Linux Enterprise Server 11 (x86_64)<br>VERSION = 11<br>PATCHLEVEL = 2  </li>
<li>linux-wdoa:~ # iscsiadm -m discovery -t st -p 172.16.130.100  无法连接<br>iscsiadm: can not connect to iSCSI daemon (111)!<br>iscsiadm: Could not scan /sys/class/iscsi_transport.<br>iscsiadm: iSCSI driver tcp is not loaded. Load the module then retry the command.<br>iscsiadm: Could not perform SendTargets discovery: iSCSI driver not found.   <pre><code>Please make sure it is loaded, and retry the operation  
</code></pre></li>
<li>linux-wdoa:~ # chkconfig –list |grep iscsi  找不到iscsi服务</li>
</ul>
</li>
</ul>
</li>
<li>shell script for add access ip address:<br><code>#!/bin/bash</code><br><code>#ucli iscsi_access -A -d r5 -v tt01 -i 172.16.*.*</code><br><code>dg_name=r5</code><br><code>vd_name=tt</code><br><code>vd_size=100000</code><br><code>ip_addr=172.16.*.*</code><br><code>for i in {1..32}</code><br><code>do</code>  <pre><code>`if [ $i -lt 10 ]; then`  
     `ucli iscsi_access -A -d $dg_name -v ${vd_name}0$i -i $ip_addr`  
`else`  
    `ucli iscsi_access -A -d $dg_name -v ${vd_name}$i  -i $ip_addr`  
`fi`  
</code></pre><code>done</code>  </li>
<li>shell to create iscsi volumn: <code>ucli vd_iscsi --create -d r5 -v tt0 -s 100000</code></li>
<li>时间戳转换<ul>
<li><code>date +%s</code> print timestamp of current time</li>
<li><code>date -d @1420210697</code> translate timestamp to datetime </li>
<li><code>date +%s -d&quot;Jan 1, 1970 00:00:01&quot;</code> translate datetime to timestamp </li>
<li><a href="http://tool.chinaz.com/Tools/unixtime.aspx" target="_blank" rel="external">http://tool.chinaz.com/Tools/unixtime.aspx</a></li>
</ul>
</li>
<li>研究客户现场iscsi卷挂载失败问题. 我的思路:<ul>
<li>既然技术支持远程查看存储硬盘，RAID，卷，iscsi服务等正常, 那么可以在discovery<br>和login的时候，使用tcpdump在两边都抓一下包，看看具体的包情况。</li>
<li>邮件发出时间是<code>2015-01-03 03:46</code>, 问题出现范围是前天到今天凌晨3点,说明至少<br>在<code>2015-01-01 00:00</code>就发生问题；监控视频和图片没有存储到存储设备上。</li>
<li>HE, M3<ul>
<li>HE(1,4,13,Fail), M3(141,ok)</li>
<li>HE version 2010, M3 version 2011</li>
<li>iet version difference</li>
</ul>
</li>
<li>错误信息汇总:<ul>
<li>ietd: Destroy a target 1090808065 10</li>
<li>sysctl table check failed: /fs/all-write-without-o_sync .5.22 Unknown sysctl binary path</li>
<li>iscsi_trgt: open_path(139) Can’t open /dev/dg4/cc068 -2</li>
<li>iscsi_trgt: fileio_attach(334) -2</li>
<li>Received logout cmnd: Target 28 Initiator: iqn.1996-04.de.suse:01:ab87d8aafb5f</li>
<li>[debug]<a href="Unable to open file">0x00000001</a>open file failed</li>
</ul>
</li>
</ul>
</li>
</ul>
<h4 id="2015-01-03"><a href="#2015-01-03" class="headerlink" title="2015-01-03"></a>2015-01-03</h4><ul>
<li>运行命令报错: iscsiadm -m discovery -t st -p 173.4.35.4:3260<br>iscsiadm: socket 3 header read time out<br>iscsiadm: Login I/O error, failed to receive a PDU<br>iscsiadm: retrying discovery login to 173.4.35.4<br>iscsiadm: socket 3 header read time out<br>iscsiadm: Login I/O error, failed to receive a PDU<br>iscsiadm: retrying discovery login to 173.4.35.4  <ul>
<li>何解?</li>
<li>没有案发现场，如何提取有效信息呢？</li>
</ul>
</li>
</ul>
<h4 id="2015-01-01"><a href="#2015-01-01" class="headerlink" title="2015-01-01"></a>2015-01-01</h4><ul>
<li>元旦放假三天</li>
</ul>

      
    </div>
    <footer class="article-footer">
      <a data-url="http://yoursite.com/work_diary/2015.html" data-id="ciqpd87x400iok0pvokw5ci0i" class="article-share-link">Partager</a>
      
      
    </footer>
  </div>
  
    
  
</article>

</section>
        
          <aside id="sidebar">
  
    
  <div class="widget-wrap">
    <h3 class="widget-title">Catégories</h3>
    <div class="widget">
      <ul class="category-list"><li class="category-list-item"><a class="category-list-link" href="/categories/blog/">blog</a></li><li class="category-list-item"><a class="category-list-link" href="/categories/database/">database</a></li><li class="category-list-item"><a class="category-list-link" href="/categories/english/">english</a></li><li class="category-list-item"><a class="category-list-link" href="/categories/kernel/">kernel</a></li><li class="category-list-item"><a class="category-list-link" href="/categories/language/">language</a></li><li class="category-list-item"><a class="category-list-link" href="/categories/linux/">linux</a></li><li class="category-list-item"><a class="category-list-link" href="/categories/math/">math</a></li><li class="category-list-item"><a class="category-list-link" href="/categories/network/">network</a></li><li class="category-list-item"><a class="category-list-link" href="/categories/others/">others</a></li><li class="category-list-item"><a class="category-list-link" href="/categories/person/">person</a></li><li class="category-list-item"><a class="category-list-link" href="/categories/program/">program</a></li><li class="category-list-item"><a class="category-list-link" href="/categories/source/">source</a></li><li class="category-list-item"><a class="category-list-link" href="/categories/storage/">storage</a></li><li class="category-list-item"><a class="category-list-link" href="/categories/tools/">tools</a></li><li class="category-list-item"><a class="category-list-link" href="/categories/windows/">windows</a></li></ul>
    </div>
  </div>


  
    
  <div class="widget-wrap">
    <h3 class="widget-title">Mot-clés</h3>
    <div class="widget">
      <ul class="tag-list"><li class="tag-list-item"><a class="tag-list-link" href="/tags/FAQ/">FAQ</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/IRC/">IRC</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/Translation/">Translation</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/android/">android</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/api/">api</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/assembly/">assembly</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/awk/">awk</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/batch/">batch</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/blog/">blog</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/book/">book</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/c/">c</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/c/">c++</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/cache/">cache</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/crash/">crash</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/database/">database</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/debug/">debug</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/dot/">dot</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/driver/">driver</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/emacs/">emacs</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/exploit/">exploit</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/file-system/">file system</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/filesystem/">filesystem</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/flowchart/">flowchart</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/gcc/">gcc</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/git/">git</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/google/">google</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/graphviz/">graphviz</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/hexo/">hexo</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/hosts/">hosts</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/iscsi/">iscsi</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/java/">java</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/javascript/">javascript</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/job/">job</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/json/">json</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/kernel/">kernel</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/linux/">linux</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/lisp/">lisp</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/lua/">lua</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/makefile/">makefile</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/malloc/">malloc</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/math/">math</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/maxima/">maxima</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/memory/">memory</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/memory-overflow/">memory overflow</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/mtrace/">mtrace</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/netdisk/">netdisk</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/network/">network</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/others/">others</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/pandoc/">pandoc</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/performance/">performance</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/person/">person</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/protobuf/">protobuf</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/python/">python</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/rsync/">rsync</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/sed/">sed</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/shell/">shell</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/skype/">skype</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/sms/">sms</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/source/">source</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/ssh/">ssh</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/stack/">stack</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/storage/">storage</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/study/">study</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/svn/">svn</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/sync/">sync</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/test/">test</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/time/">time</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/tools/">tools</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/valgrind/">valgrind</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/vi/">vi</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/vim/">vim</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/virtual/">virtual</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/wget/">wget</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/windows/">windows</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/wireshark/">wireshark</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/write/">write</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/xml/">xml</a></li></ul>
    </div>
  </div>


  
    
  <div class="widget-wrap">
    <h3 class="widget-title">Nuage de mot-clés</h3>
    <div class="widget tagcloud">
      <a href="/tags/FAQ/" style="font-size: 10px;">FAQ</a> <a href="/tags/IRC/" style="font-size: 10px;">IRC</a> <a href="/tags/Translation/" style="font-size: 13px;">Translation</a> <a href="/tags/android/" style="font-size: 10px;">android</a> <a href="/tags/api/" style="font-size: 10px;">api</a> <a href="/tags/assembly/" style="font-size: 10px;">assembly</a> <a href="/tags/awk/" style="font-size: 11px;">awk</a> <a href="/tags/batch/" style="font-size: 14px;">batch</a> <a href="/tags/blog/" style="font-size: 10px;">blog</a> <a href="/tags/book/" style="font-size: 10px;">book</a> <a href="/tags/c/" style="font-size: 16px;">c</a> <a href="/tags/c/" style="font-size: 19px;">c++</a> <a href="/tags/cache/" style="font-size: 10px;">cache</a> <a href="/tags/crash/" style="font-size: 10px;">crash</a> <a href="/tags/database/" style="font-size: 17px;">database</a> <a href="/tags/debug/" style="font-size: 12px;">debug</a> <a href="/tags/dot/" style="font-size: 10px;">dot</a> <a href="/tags/driver/" style="font-size: 10px;">driver</a> <a href="/tags/emacs/" style="font-size: 11px;">emacs</a> <a href="/tags/exploit/" style="font-size: 10px;">exploit</a> <a href="/tags/file-system/" style="font-size: 10px;">file system</a> <a href="/tags/filesystem/" style="font-size: 12px;">filesystem</a> <a href="/tags/flowchart/" style="font-size: 10px;">flowchart</a> <a href="/tags/gcc/" style="font-size: 10px;">gcc</a> <a href="/tags/git/" style="font-size: 12px;">git</a> <a href="/tags/google/" style="font-size: 11px;">google</a> <a href="/tags/graphviz/" style="font-size: 11px;">graphviz</a> <a href="/tags/hexo/" style="font-size: 10px;">hexo</a> <a href="/tags/hosts/" style="font-size: 10px;">hosts</a> <a href="/tags/iscsi/" style="font-size: 14px;">iscsi</a> <a href="/tags/java/" style="font-size: 10px;">java</a> <a href="/tags/javascript/" style="font-size: 10px;">javascript</a> <a href="/tags/job/" style="font-size: 10px;">job</a> <a href="/tags/json/" style="font-size: 10px;">json</a> <a href="/tags/kernel/" style="font-size: 14px;">kernel</a> <a href="/tags/linux/" style="font-size: 14px;">linux</a> <a href="/tags/lisp/" style="font-size: 10px;">lisp</a> <a href="/tags/lua/" style="font-size: 10px;">lua</a> <a href="/tags/makefile/" style="font-size: 10px;">makefile</a> <a href="/tags/malloc/" style="font-size: 10px;">malloc</a> <a href="/tags/math/" style="font-size: 11px;">math</a> <a href="/tags/maxima/" style="font-size: 10px;">maxima</a> <a href="/tags/memory/" style="font-size: 11px;">memory</a> <a href="/tags/memory-overflow/" style="font-size: 10px;">memory overflow</a> <a href="/tags/mtrace/" style="font-size: 10px;">mtrace</a> <a href="/tags/netdisk/" style="font-size: 10px;">netdisk</a> <a href="/tags/network/" style="font-size: 20px;">network</a> <a href="/tags/others/" style="font-size: 18px;">others</a> <a href="/tags/pandoc/" style="font-size: 10px;">pandoc</a> <a href="/tags/performance/" style="font-size: 16px;">performance</a> <a href="/tags/person/" style="font-size: 11px;">person</a> <a href="/tags/protobuf/" style="font-size: 11px;">protobuf</a> <a href="/tags/python/" style="font-size: 10px;">python</a> <a href="/tags/rsync/" style="font-size: 10px;">rsync</a> <a href="/tags/sed/" style="font-size: 11px;">sed</a> <a href="/tags/shell/" style="font-size: 15px;">shell</a> <a href="/tags/skype/" style="font-size: 11px;">skype</a> <a href="/tags/sms/" style="font-size: 10px;">sms</a> <a href="/tags/source/" style="font-size: 11px;">source</a> <a href="/tags/ssh/" style="font-size: 10px;">ssh</a> <a href="/tags/stack/" style="font-size: 10px;">stack</a> <a href="/tags/storage/" style="font-size: 15px;">storage</a> <a href="/tags/study/" style="font-size: 10px;">study</a> <a href="/tags/svn/" style="font-size: 11px;">svn</a> <a href="/tags/sync/" style="font-size: 10px;">sync</a> <a href="/tags/test/" style="font-size: 11px;">test</a> <a href="/tags/time/" style="font-size: 10px;">time</a> <a href="/tags/tools/" style="font-size: 16px;">tools</a> <a href="/tags/valgrind/" style="font-size: 10px;">valgrind</a> <a href="/tags/vi/" style="font-size: 10px;">vi</a> <a href="/tags/vim/" style="font-size: 14px;">vim</a> <a href="/tags/virtual/" style="font-size: 11px;">virtual</a> <a href="/tags/wget/" style="font-size: 10px;">wget</a> <a href="/tags/windows/" style="font-size: 11px;">windows</a> <a href="/tags/wireshark/" style="font-size: 10px;">wireshark</a> <a href="/tags/write/" style="font-size: 13px;">write</a> <a href="/tags/xml/" style="font-size: 10px;">xml</a>
    </div>
  </div>

  
    
  <div class="widget-wrap">
    <h3 class="widget-title">Archives</h3>
    <div class="widget">
      <ul class="archive-list"><li class="archive-list-item"><a class="archive-list-link" href="/archives/2016/07/">July 2016</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2016/04/">April 2016</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2016/03/">March 2016</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2016/02/">February 2016</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2016/01/">January 2016</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2015/11/">November 2015</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2015/10/">October 2015</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2015/09/">September 2015</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2015/08/">August 2015</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2015/07/">July 2015</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2015/06/">June 2015</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2015/03/">March 2015</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2015/02/">February 2015</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2015/01/">January 2015</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2014/12/">December 2014</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2014/11/">November 2014</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2014/09/">September 2014</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2014/08/">August 2014</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2014/07/">July 2014</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2014/06/">June 2014</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2014/05/">May 2014</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2014/04/">April 2014</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2014/03/">March 2014</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2013/11/">November 2013</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2013/10/">October 2013</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2013/09/">September 2013</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2013/08/">August 2013</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2013/07/">July 2013</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2013/06/">June 2013</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2013/05/">May 2013</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2013/04/">April 2013</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2013/03/">March 2013</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2013/02/">February 2013</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2013/01/">January 2013</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2012/12/">December 2012</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2012/09/">September 2012</a></li></ul>
    </div>
  </div>


  
    
  <div class="widget-wrap">
    <h3 class="widget-title">Articles récents</h3>
    <div class="widget">
      <ul>
        
          <li>
            <a href="/2016/07/17/how-to-implement-malloc/">如何实现一个malloc</a>
          </li>
        
          <li>
            <a href="/2016/07/17/study-grep-more/">grep工作原理</a>
          </li>
        
          <li>
            <a href="/2016/07/17/2016-04-13-malloc/">malloc</a>
          </li>
        
          <li>
            <a href="/2016/04/27/include-what-you-use/">使用IWYU整理头文件引用</a>
          </li>
        
          <li>
            <a href="/2016/04/24/understand-gcc-assembly-output/">understand gcc assembly output</a>
          </li>
        
      </ul>
    </div>
  </div>

  
</aside>
        
      </div>
      <footer id="footer">
  
  <div class="outer">
    <div id="footer-info" class="inner">
      &copy; 2016 Matrix207<br>
      Propulsé by <a href="http://hexo.io/" target="_blank">Hexo</a>
    </div>
  </div>
</footer>
    </div>
    <nav id="mobile-nav">
  
    <a href="/" class="mobile-nav-link">Home</a>
  
    <a href="/archives" class="mobile-nav-link">Archives</a>
  
</nav>
    

<script src="//ajax.googleapis.com/ajax/libs/jquery/2.0.3/jquery.min.js"></script>


  <link rel="stylesheet" href="/fancybox/jquery.fancybox.css">
  <script src="/fancybox/jquery.fancybox.pack.js"></script>


<script src="/js/script.js"></script>

  </div>
</body>
</html>